zoukankan      html  css  js  c++  java
  • 【转】Python中的可变对象和不可变对象

    python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如list。而不可变的对象则相反,表示其内容不可变。

    不可变(immutable):int、字符串(str)、float、(数值型number)、元组(tuple)、None(空)

    可变(mutable):字典型(dictionary)、列表型(list), set(集合)

     

    廖雪峰博客:”为什么要设计strNone这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。“

    一、不可变对象

    由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的。运用这样的机制,有时候会让人产生糊涂,似乎可变对象变化了。如下面的代码:

    i = 73
    i += 2

    从上面得知,不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用

    >>>x = 1
    >>>y = 1
    >>>x = 1
    >>> x is y
    True
    >>>y is z
    True

    如上所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。

      总结一下,不可变对象的优缺点。

        优点是,这样可以减少重复的值对内存空间的占用

        缺点呢,如例1所示,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。

    第三个例子

    a='abc'
    d={a:100}
    print(d)
    a=a.replace('a','A')
    print(a)
    print(d['abc'])
    print(d)
    print(d[a])

    执行结果为

    d={a:100}这一句执行完后,存入dict的是a指向的对象,即'abc',而不是a变量本身。
    之后a=a.replace('a','A')这一句将a变量指向了新的对象('Abc')
    此时print(a)显然输出的是
    'Abc',而由于dict里面存入的key依然是'abc',所以以'abc'作为key查找依然可以得到结果,但是如果此时用a变量所指的对象('Abc')来查询dict便会报错了。
    参考地址:http://blog.csdn.net/taohuaxinmu123/article/details/39008281
  • 相关阅读:
    python中list的一种取值方式切片
    python之字典(Dictionary)
    表示数字
    自动收售货系统
    明明的随机数
    自守数
    等差数列
    计算字符个数
    字符统计
    Redraimen的走法
  • 原文地址:https://www.cnblogs.com/kiwibird/p/4920120.html
Copyright © 2011-2022 走看看