Immutable vs Mutable类型

问题:

我对什么是不可变的类型感到困惑。我知道float对象被认为是不可变的,这种类型的例子来自我的书:

class RoundFloat(float):
    def __new__(cls, val):
        return float.__new__(cls, round(val, 2))

这被认为是不可变的,因为类结构/层次结构?,意思是float在类的顶部,是它自己的方法调用。类似于这种类型的例子(即使我的书说dict是可变的):

class SortedKeyDict(dict):
    def __new__(cls, val):
        return dict.__new__(cls, val.clear())

而某些可变的方法在类中有方法,具有这种类型的示例:

class SortedKeyDict_a(dict):
    def example(self):
        return self.keys()

另外,对于最后一个class(SortedKeyDict_a),如果我将这种类型的集合传递给它:

d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))

没有调用example方法,它返回一个字典。 SortedKeyDict__new__标记为错误。我尝试使用__new__将整数传递给RoundFloat类,并标记没有错误。

回答:

什么?浮动是不可变的?但我不能做

x = 5.0
x += 7.0
print x # 12.0

不是那个“mut”x?
你同意字符串是不可变的吗?但你也可以做同样的事情。

s = 'foo'
s += 'bar'
print s # foobar

变量的值发生变化,但是通过更改变量所引用的变化。可变类型可以改变这种方式,并且可以also更改“到位”。
这是有区别的。

x = something # immutable type
print x
func(x)
print x # prints the same thing

x = something # mutable type
print x
func(x)
print x # might print something different

x = something # immutable type
y = x
print x
# some statement that operates on y
print x # prints the same thing

x = something # mutable type
y = x
print x
# some statement that operates on y
print x # might print something different

具体的例子

x = 'foo'
y = x
print x # foo
y += 'bar'
print x # foo

x = [1, 2, 3]
y = x
print x # [1, 2, 3]
y += [3, 2, 1]
print x # [1, 2, 3, 3, 2, 1]

def func(val):
    val += 'bar'

x = 'foo'
print x # foo
func(x)
print x # foo

def func(val):
    val += [3, 2, 1]

x = [1, 2, 3]
print x # [1, 2, 3]
func(x)
print x # [1, 2, 3, 3, 2, 1]

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Immutable vs Mutable types

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 + 1 =