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 client使用http post 到server端的代码
Feb 10 Python
Python中使用logging模块打印log日志详解
Apr 05 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
python3中bytes和string之间的互相转换
Feb 09 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
python dataframe NaN处理方式
Dec 26 Python
Python socket聊天脚本代码实例
Jan 02 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
Python类中self参数用法详解
Feb 13 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
Python可变集合和不可变集合的构造方法大全
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
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
django 读取图片到页面实例
2020/03/27 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
python3中for循环踩过的坑记录
2020/12/14 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
买房子个人收入证明
2014/01/16 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
单位委托书怎么写
2014/08/02 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
保安辞职信范文
2015/02/28 职场文书
2015年司法所工作总结
2015/04/27 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python