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生成器实现微线程编程的教程
Apr 13 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
Jul 22 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python 支付整合开发包的实现
Jan 23 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
如何使用python进行pdf文件分割
Nov 11 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 Python
Python中的xlrd模块使用整理
Jun 15 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
基于jquery实现多选下拉列表
2017/08/02 jQuery
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
建筑实习自我鉴定
2013/10/18 职场文书
环保小标语
2014/06/13 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
党员批评与自我批评
2014/10/15 职场文书
党员剖析材料范文
2014/12/18 职场文书
检讨书范文
2015/01/27 职场文书
小学六年级毕业感言
2015/07/30 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python