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中文件I/O高效操作处理的技巧分享
Feb 04 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
Python实现的栈(Stack)
Jan 26 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
Jun 26 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
python之array赋值技巧分享
Nov 28 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
pytorch 中nn.Dropout的使用说明
May 20 Python
Django框架之路由用法
Jun 10 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
2.PHP入门
2006/10/09 PHP
PHP如何编写易读的代码
2007/07/10 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
斜45度寻路实现函数
2009/08/20 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
Python命名空间详解
2014/08/18 Python
Python中使用item()方法遍历字典的例子
2014/08/26 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
Python字典底层实现原理详解
2019/12/18 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
毕业生求职推荐信
2013/11/04 职场文书
《月迹》教学反思
2014/02/19 职场文书
中考冲刺决心书
2014/03/11 职场文书
父母寄语大全
2014/04/12 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
煤矿安全保证书
2015/02/27 职场文书
心灵点滴观后感
2015/06/02 职场文书
公司安全管理制度范本
2015/08/05 职场文书
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript