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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |