加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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产生共鸣但是
y.b没有.

希望有人能澄清一下.

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读