从我的实际代码中得到的一个示例:某个类(例如Man)具有一个属性,该属性是一个列表,例如q,初始化为[0,0]。如果我在Man实例中分别为q的元素分配值,则其他实例的所有q都将被覆盖。我没想到。
我已经学到了“艰难的方法”,即如果用整个列表进行赋值则不会发生这种情况(例如q = [27,35])。但我想了解其背后的逻辑,以避免将来出现痛苦的错误。
import random
class Man():
def __init__(self, c=0, q=[0,0]):
self.c, self.q = c, q
men={}
for i in range(3):
oneman = Man()
oneman.c= random.randint(1,70)
oneman.q[0]= i*3
oneman.q[1]= i*11
men[i]= oneman
print(' man c q')
for im,m in men.items():
print('{:^5d} {:^5d} {:} '.format(im, m.c, m.q))
我希望men [0] .q = [0,0],men [1] .q = [3,11],men [2] .q = [6,22] 但相反,我得到的是前一个人的值填充前一个人的q []:
man c q
0 18 [6, 22]
1 13 [6, 22]
2 9 [6, 22]
请注意,标量属性“ c”不会发生这种情况。
如前所述,我发现赋值形式为
oneman.q= [i*3, i*11]
克服了这个问题,但我想知道为什么。谢谢。