对于list和int,类变量的行为有所不同?

Aav*_*aas 3 python python-2.7

据我所知,类共享变量与类的所有实例共享.但是我无法理解这个问题.

class c():
    a=[1]
    b=1
    def __init__(self):
        pass

x=c()
x.a.append(1)
x.b+=1 #or x.b=2

print x.a #[1,1]
print x.b #2

y=c()
print y.a #[1,1] :As Expected
print y.b #1 :why not 2?
Run Code Online (Sandbox Code Playgroud)

yaxa共振,但 yb没有.

希望有人能澄清一下.

编辑:如何为整数创建相同的功能.

Fre*_*Foo 10

x.a.append(1)
Run Code Online (Sandbox Code Playgroud)

通过调用其方法来更改类属性c.aa list,该append方法就地修改列表.

x.b += 1
Run Code Online (Sandbox Code Playgroud)

实际上是一个简写

x.b = x.b + 1
Run Code Online (Sandbox Code Playgroud)

因为Python中的整数是不可变的,所以它们没有__iadd__(就地添加)方法.这个赋值的结果是b在实例上设置一个属性x,带有值2(评估赋值右侧的结果).此新实例属性会影响类属性.

要查看就地操作和分配之间的区别,请尝试

x.a += [1]
Run Code Online (Sandbox Code Playgroud)

x.a = x.a + [1]
Run Code Online (Sandbox Code Playgroud)

这些将有不同的行为.

编辑通过装箱可以获得整数相同的功能:

class HasABoxedInt(object):
    boxed_int = [0]    # int boxed in a singleton list

a = HasABoxedInt()
a.boxed_int[0] += 1
b = HasABoxedInt()
print(b.boxed_int[0])  # prints 1, not zero
Run Code Online (Sandbox Code Playgroud)

要么

class BoxedInt(object):
    def __init__(self, value):
        self.value = value
    def __iadd__(self, i):
        self.value += i
Run Code Online (Sandbox Code Playgroud)