Python 类变量的地址赋值问题(循环后的变量总是最后一次的数值,即使只赋值了一次)
参考:
对 Python 变量地址的一些理解
版权声明:本文为CSDN博主「我有两颗糖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41140138/article/details/118396736
情景
遇到一种奇怪的现象,实例化类对象之后,将类变量赋值给我们自定义的变量,循环几次,即使我们赋值操作只在首次进行,但是随着循环的进行,这个被赋值过的自定义变量,依然会随着类变量的改变而改变。不禁让人怀疑,科学的尽头是玄学。
代码演示
import numpy as np
class A:
def __init__(self):
self.c = np.array([[1, 1, 1], [1, 2, 1]])
class B(A):
def __init__(self):
super().__init__()
def test(self):
self.c += 1
# self.c = self.c + 1
class C(B):
def __init__(self):
super().__init__()
if __name__ == '__main__':
aa = C()
b = 0
for i in range(10):
aa.test()
if i == 0:
b = aa.c
print(aa.c)
print('b', b)
说明:
1.如果你的写法是:
def test(self):
self.c += 1
得到的结果就是:
[[2 2 2]
[2 3 2]]
...
[[10 10 10]
[10 11 10]]
[[11 11 11]
[11 12 11]]
b [[11 11 11]
[11 12 11]]
即使b只在第一次循环时候被赋值,之后不再被改变,结果,最后输出的时候,却和最后一次的循环值相同
2.如果你的写法是:
def test(self):
self.c = self.c + 1
得到的结果:
b [[2 2 2]
[2 3 2]]
结果是第一次赋值的数值
原因
后面一种方法没有修改原始列表内容, 是重新分配了列表 ,而不是修改原有的列表。
与 ’‘+=’‘ 等效的还有 append() 的方法
具体情况可以使用 id() 的方法查看标识符, 不同的标识符对应不同地址