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脚本实现网卡流量监控
Feb 14 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
Python正则捕获操作示例
Aug 19 Python
详解Python进程间通信之命名管道
Aug 28 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
浅谈django orm 优化
Aug 18 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
python学生管理系统
Jan 30 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
如何利用python创作字符画
Jun 25 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
Python排序函数的使用方法详解
2020/12/11 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
2013年学期结束动员演讲稿
2014/01/07 职场文书
公司会计岗位职责
2014/02/13 职场文书
分家协议书
2014/04/21 职场文书
法院授权委托书格式
2014/09/28 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
Java字符串逆序方法详情
2022/03/21 Java/Android