为什么在python中共享列表而不是变量(类级别)

Jac*_*row 2 python oop

class abc :
    x = 10
    list = []   
    def __init__(self):
        self.a = 30      
        self.b = 40

a = abc()
b = abc()
a.x = a.x + 1
print a.x
print b.x
a.list.append(1)
print b.list   

Output :
10
11
[1]
Run Code Online (Sandbox Code Playgroud)

所以我们看到它x不是跨对象共享的a,b而是list共享的.有人可以解释这种行为吗?

所以它的答案似乎在于列表是可变的objs而数字不是:

class abc :
   x = 10
   m_list = []

   def __init__(self):
       self.a = 30      
       self.b = 40



a = abc()
b = abc()
print id(a.x)
a.x = a.x + 1
print id(a.x)
print a.x
print b.x
print id(a.m_list)
a.m_list.append(1)
print id(a.m_list)
print b.m_list
print id(b.m_list)


output :
5342052
5342040
11
10
38600656
38600656
[1]
38600656

but this is so strange ...numbers are immutable ?
Run Code Online (Sandbox Code Playgroud)

jon*_*rpe 6

它们都在类的所有实例之间共享,但不同之处在于列表是可变的,但整数是不可变的.

这个:

a.x = a.x + 1
Run Code Online (Sandbox Code Playgroud)

创建一个新的不可变int对象*然后指向a.x(但不是 b.x)新对象.

相比之下,这:

a.list.append(1)
Run Code Online (Sandbox Code Playgroud)

修改可变list对象a.list(和b.list)已经指向就地.

您可以使用例如更一致地修改不可变类属性

abc.x = abc.x + 1
abc.list.append(1)
Run Code Online (Sandbox Code Playgroud)

并且不要调用自己的变量list!

*小整数在CPython中被"实习",但现在让我们不要担心


归档时间:

查看次数:

160 次

最近记录:

11 年,4 月 前