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 20 Python
使用python实现省市三级菜单效果
Jan 20 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python实现梯度下降法
Mar 24 Python
Python文件时间操作步骤代码详解
Apr 13 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
Apr 16 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
python中有帮助函数吗
Jun 19 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 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
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
使用python计算三角形的斜边例子
2020/04/15 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
django的autoreload机制实现
2020/06/03 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
python基于opencv实现人脸识别
2021/01/04 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
高中体育教学反思
2014/01/29 职场文书
就业意向书
2014/07/29 职场文书
政风行风评议心得体会
2014/10/21 职场文书
导游欢送词
2015/01/31 职场文书