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中使用全局日志时需要注意的问题
May 06 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
python实现可逆简单的加密算法
Mar 22 Python
Python安装与基本数据类型教程详解
May 29 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
总结Python常用的魔法方法
May 25 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 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
YB217、YB235、YB400浅听
2021/03/02 无线电
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
详解Python中的序列化与反序列化的使用
2015/06/30 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
Django如何实现上传图片功能
2019/08/16 Python
Python内置加密模块用法解析
2019/11/25 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
中式餐厅创业计划书范文
2014/01/23 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
Redis实现订单过期删除的方法步骤
2022/06/05 Redis