python – 类变量对list和int的行为有所不同?
发布时间:2020-12-20 12:23:10 所属栏目:Python 来源:网络整理
导读:据我所知,类共享变量与类的所有实例共享.但是我无法理解这个问题. class c(): a=[1] b=1 def __init__(self): passx=c()x.a.append(1)x.b+=1 #or x.b=2print x.a #[1,1]print x.b #2y=c()print y.a #[1,1] :As Expectedprint y.b #1 :why not 2? y.a与x.a产
|
据我所知,类共享变量与类的所有实例共享.但是我无法理解这个问题.
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?
y.a与x.a产生共鸣但是 希望有人能澄清一下. 编辑:如何为整数创建相同的功能. 解决方法x.a.append(1) 通过调用其append方法更改类属性c.a(列表),该方法可就地修改列表. x.b += 1 实际上是一个简写 x.b = x.b + 1 因为Python中的整数是不可变的,所以它们没有__iadd __(就地添加)方法.此赋值的结果是在实例x上设置属性b,值为2(评估赋值右侧的结果).此新实例属性会影响类属性. 要查看就地操作和分配之间的区别,请尝试 x.a += [1] 和 x.a = x.a + [1] 这些将有不同的行为. 编辑通过装箱可以获得整数相同的功能: 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
要么 class BoxedInt(object):
def __init__(self,value):
self.value = value
def __iadd__(self,i):
self.value += i
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
