将一个列表传递给一个类python

这个问题在这里已经有了答案:

  • “最小的惊讶”和可变的默认参数30的答案

  • 这看起来像是发生了,因为你将相同的列表传递给每个对象。 因此,所有对象都保持对同一列表的引用,并且由于list是可变的,它似乎一次改变它们的“全部”。

    要解决此问题,请在每次创建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构造函数的默认参数总是指向相同的列表。 看到这个问题的解释为什么,但要解决它,只使用None作为您的默认,而不是[]

    class revs:
        def __init__(self, rev, us, accs=None):
            self.rev = rev
            self.us = us
            if accs is None:
                accs = []
            self.accs = accs
    
    链接地址: http://www.djcxy.com/p/28541.html

    上一篇: Pass a list to a class python

    下一篇: Lifetime of default function arguments in python