这看起来像是发生了,因为您将相同的列表传递给每个对象。结果,所有对象都维护对同一列表的引用,并且因为list
是可变的,它似乎同时改变了“所有”。
要解决此问题,请传入new每次创建时为空列表revs
对象,或者克隆您传入的列表:
cada = revs(rev, us, list_acct[:])
请注意,如果list_acct
包含可变对象,您仍然可能再次遇到相同的问题,但更深一层!
如果您不将列表传递给revs
当你创建对象时(我不知道,因为你没有显示完整的代码!),那么你会遇到同样的问题,但原因不同:在Python中,默认参数都被评估一次,在函数定义的时间。因此,您可以获得以下行为:
r1 = revs(1, 1)
r2 = revs(2, 2)
r1.accs.append("Hi!")
print(r1.accs) # prints ['Hi!']
print(r2.accs) # prints ['Hi!']
因为默认参数为revs
构造函数总是指向同一个列表。看这个问题 https://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument要解释为什么,但要解决它,只需使用None
作为您的默认值而不是[]
.
class revs:
def __init__(self, rev, us, accs=None):
self.rev = rev
self.us = us
if accs is None:
accs = []
self.accs = accs