我有一个简单的课程:
class revs:
def __init__(self, rev, us, accs = []):
self.rev = rev
self.us = us
self.accs = accs
我有一段代码把值赋给列表,它在循环中
rev, usu = cada_l.split("|")
acct = each_l[:2].strip()
list_acct.append(acct)
最后,我创建了一个dict来管理这样的rev列表:
drevs = {}
cada = revs(rev, us, list_acct)
drevs[cada.rev] = cada
它可以与rev和us一起正常工作,但是list-acct会更新所有实例:
drevs['1'].rev
'1'
drevs['2'].rev
'2'
drevs['1'].us
'user1'
drevs['2'].us
'user2'
drevs['1'].accs
'["Doc1","Doc2"]'
drevs['2'].accs
'["Doc1","Doc2"]'
如果我更改list_acct.clear(),那么所有实例中的值都是清晰的,我对Python还很陌生,这让我很困惑。
谢谢
这看起来像是发生了,因为您将相同的列表传递给每个对象。因此,所有对象都保持对同一列表的引用,并且由于
list
是可变的,因此它似乎会同时更改所有对象。要解决此问题,请在每次创建
revs
对象时传入一个新的空列表,或者克隆传入的列表:请注意,如果
list_acct
包含可变对象,您仍然可能再次陷入相同的问题,但更深一层!如果在创建列表时没有将列表传递给
revs
对象(我不能说,因为您没有显示完整的代码!),则有相同的问题,但原因不同:在Python中,在函数定义时,默认参数都会求值一次。因此,您可以得到这种行为:因为
revs
构造函数的默认参数总是指向同一个列表。有关原因的解释,请参见this question,但要解决这个问题,只需使用None
作为默认值,而不是[]
。相关问题 更多 >
编程相关推荐