python - 类变量对于 list 和 int 的行为不同?

标签 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?

y.ax.a 产生共鸣,但 y.b 没有。

希望有人能解释清楚。

编辑:以及如何为整数创建相同的功能。

最佳答案

x.a.append(1)

通过调用其 append 方法更改类属性 c.a,一个 list,该方法就地修改列表。

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

关于python - 类变量对于 list 和 int 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420078/

相关文章:

python-2.7 - 如何在Python中刷新chatterbot机器人的训练?

python - 具有 python 字典值的 Gurobi 目标

python - 脚本中的 virtualenv 目录

python - Mechanize 复选框控件不起作用python

python - 文件对象传递抛出 csv 阅读器 Python 3.6

python - 在python中计算小时和分钟

sql - pyodbc 执行命令不接受?参数正确?

python - 将十六进制字符串文件转换为整数的最佳方法

python - 为什么运行 py 和 kv 脚本时出现空白屏幕?

python - Argparse 和几个排他性参数