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与js)两种实现
Feb 21 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
Python字符串处理实例详解
May 18 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
python调用c++传递数组的实例
Feb 13 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
python语言的优势是什么
Jun 17 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
python里glob模块知识点总结
Jan 05 Python
Python Numpy之linspace用法说明
Apr 17 Python
Python数据分析之pandas读取数据
Jun 02 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去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
javascript中关于执行环境的杂谈
2011/08/14 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python多进程控制学习小结
2018/10/31 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python 画函数曲线示例
2019/12/04 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
应届生高等护理求职信
2013/10/12 职场文书
初入社会应届生求职信
2013/11/18 职场文书
中学校庆方案
2014/03/17 职场文书
2014年手术室工作总结
2014/11/26 职场文书
情人节单身感言
2015/08/03 职场文书
JavaScript函数柯里化
2021/11/07 Javascript
Go语言基础map用法及示例详解
2021/11/17 Golang