python变量赋值方法(可变与不可变)

 更新时间:2019年01月12日 15:46:57   作者:魔亦有道   我要评论

今天小编就为大家分享一篇python变量赋值方法(可变与不可变),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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变量赋值方法(可变与不可变)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • pip命令无法使用的解决方法

    pip命令无法使用的解决方法

    今天小编就为大家分享一篇pip命令无法使用的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python实现的防DDoS脚本

    python实现的防DDoS脚本

    实现原理是,查询netstat的连接数,同IP超过一定连接的用iptables封禁一定时间,自动封禁,自动解封。
    2011-02-02
  • Python绘制正余弦函数图像的方法

    Python绘制正余弦函数图像的方法

    这篇文章主要介绍了Python绘制正余弦函数图像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 解决Tensorflow使用pip安装后没有model目录的问题

    解决Tensorflow使用pip安装后没有model目录的问题

    今天小编就为大家分享一篇解决Tensorflow使用pip安装后没有model目录的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 利用Python获取赶集网招聘信息前篇

    利用Python获取赶集网招聘信息前篇

    这篇文章主要为大家分享了如何利用Python获取赶集网招聘信息的前一篇内容,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 利用python爬取斗鱼app中照片方法实例

    利用python爬取斗鱼app中照片方法实例

    最近在学习python,通过实践是学习的一个好办法,下面这篇文章就来给大家介绍了关于利用python爬取斗鱼app中照片的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。
    2017-12-12
  • Python中__init__和__new__的区别详解

    Python中__init__和__new__的区别详解

    这篇文章主要介绍了Python中__init__和__new__的区别详解,并着重说明了__new__的作用及什么情况下使用__new__,需要的朋友可以参考下
    2014-07-07
  • djang常用查询SQL语句的使用代码

    djang常用查询SQL语句的使用代码

    这篇文章主要介绍了djang常用查询SQL语句的使用代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Python实现的微信公众号群发图片与文本消息功能实例详解

    Python实现的微信公众号群发图片与文本消息功能实例详解

    这篇文章主要介绍了Python实现的微信公众号群发图片与文本消息功能,结合实例形式详细分析了Python调用微信接口实现微信公众号群发图片与文本消息的具体操作步骤与相关注意事项,需要的朋友可以参考下
    2017-06-06
  • django通过ajax发起请求返回JSON格式数据的方法

    django通过ajax发起请求返回JSON格式数据的方法

    这篇文章主要介绍了django通过ajax发起请求返回JSON格式数据的方法,较为详细的分析了django处理ajax请求的技巧,需要的朋友可以参考下
    2015-06-06

最新评论