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编辑器WingIDE的使用经验总结
Aug 31 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
python实现随机漫步算法
Aug 27 Python
Python实现多线程的两种方式分析
Aug 29 Python
mac系统下Redis安装和使用步骤详解
Jul 09 Python
在Python中获取操作系统的进程信息
Aug 27 Python
python列表生成器迭代器实例解析
Dec 19 Python
Python趣味入门教程之循环语句while
Aug 26 Python
Django nginx配置实现过程详解
Sep 10 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 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中的错误处理、异常处理机制分析
2012/05/07 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
教你php如何实现验证码
2016/01/20 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
python简单实现旋转图片的方法
2015/05/30 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
keras K.function获取某层的输出操作
2020/06/29 Python
Python连接Impala实现步骤解析
2020/08/04 Python
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
新闻学专业个人求职信写作
2014/02/04 职场文书
求职信范文大全
2014/05/26 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书