为什么在使用数组属性的python实例创建中出现这种奇怪的行为?

时间:2017-12-04 04:54:33

标签: python class instance python-3.6

我正在处理我的项目并遇到了这种奇怪的行为。以下代码显示了如何重现它。

class TestClass:
    def __init__(self, arr=[]):
        self.arr = arr


if __name__ == '__main__':
    for i in range(3):
        test = TestClass()
        test.arr.append('x')
        print(test.arr)

我希望得到以下结果:

['x']
['x']
['x']

因为在循环内创建了新的TestClass实例。但相反,我得到了:

['x']
['x', 'x']
['x', 'x', 'x']

我误解了什么吗?

python --version输出:

Python 3.6.3 :: Anaconda, Inc.

1 个答案:

答案 0 :(得分:1)

每次调用函数时都不会重新分配Python中的默认值,它会被分配一次,每次调用函数时都会访问同一个对象。因此,如果您的默认值是可变对象,例如listdict,则可以在每次调用时对其进行变更。

解决此问题的常见方法是执行以下操作:

class TestClass:
    def __init__(self, arr=None):
        self.arr = [] if arr is None else arr