python变量赋值方法(可变与不可变)


Posted in Python onJanuary 12, 2019

python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。

一、可变对象和不可变对象

Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)

可变(mutable):字典型(dictionary)、列表型(list)

不可变类型特点:

看下面的例子(例1)

i = 73 
i += 2

python变量赋值方法(可变与不可变)

从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。

看一个例子(例2)

>>>x = 1
>>>y = 1
>>>z = 1
>>> x is y
True
>>>y is z
True

如上所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。

总结一下,不可变对象的优缺点。

优点是,这样可以减少重复的值对内存空间的占用。

缺点呢,如例1所示,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。

下面看一个可变对象的例子(例3)

m=[5,9]
m+=[6]

python变量赋值方法(可变与不可变)

二、函数参数:

Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:

1、可变对象,参数改变的是可变对象,其内容可以被修改。

2、不可变对象,改变的是函数内变量的指向对象。

比如存在2个列表 a 和 b

如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]

def mutable(b = []): #函数使用了缺省变量
  b.append(0)
  return b
>>>mutable()
[0]
>>>mutable()
[0,0]
>>>mutable()
[0,0,0]

这里连续三次以缺省值,运行函数3此,每次的结果都不一样,按我们的想想,三次的结果,应该是一样的,都为[0],但是…

那么原因是什么呢,前面说过,一切皆为对象,函数mutable也为一个对象,使用dir()查看函数的属性:

dir(mutable)

['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',

上面我们三次运行了mutable这个函数,如果用mutable.__defaults__来查看函数对象的默认参数变化的话,就会发现问题了。

>>>mutable.__defaults__
([],)
>>>mutable()
[0]
>>>mutable.__defaults__
([0],)
>>>mutable()
[0,0]
>>>mutable.__defaults__
([0,0],)

仔细观察,类对象内部属性dict中'x'对应的值,在每创建一个对象时都发生了变化。也就是说,在每次创建类对象时,变量x引用内存的初始值是不同的,这终要归因于列表(list)的可变性导致的。每次创建对象时,因为列表的可变性,函数对象b的dict属性中,x键对应的值,被改变,而不是重新创建,所以出现了上面的结果。

综上:初学者如果不充分理解python的变量和类型和参数传递方式,或者是一切解释对象的原理,会很容易产生上面的错误。

以上这篇python变量赋值方法(可变与不可变)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之Python安装
Sep 12 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
python Event事件、进程池与线程池、协程解析
Oct 25 Python
使用Python来做一个屏幕录制工具的操作代码
Jan 18 Python
python实现logistic分类算法代码
Feb 28 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
python字典key不能是可以是啥类型
Aug 04 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
python交换两个变量的值方法
Jan 12 #Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 #Python
浅谈Python中的全局锁(GIL)问题
Jan 11 #Python
Python 实现子类获取父类的类成员方法
Jan 11 #Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 #Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 #Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 #Python
You might like
聊天室php&mysql(一)
2006/10/09 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php删除指定目录的方法
2015/04/03 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
js实现小星星游戏
2020/03/23 Javascript
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
简单介绍python封装的基本知识
2019/08/10 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
python用Configobj模块读取配置文件
2020/09/26 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
环境科学专业研究生求职信
2013/10/02 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
自考生自我评价
2019/06/21 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
golang的文件创建及读写操作
2022/04/14 Golang