据我所知,类共享变量与类的所有实例共享.但是我无法理解这个问题.
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)
ya与xa共振,但 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)