Python:覆盖类的所有实例的列表属性

时间:2019-08-05 16:51:46

标签: python-3.x list overwrite

从我的实际代码中得到的一个示例:某个类(例如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]

克服了这个问题,但我想知道为什么。谢谢。

0 个答案:

没有答案