我正在处理我的项目并遇到了这种奇怪的行为。以下代码显示了如何重现它。
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.
答案 0 :(得分:1)
每次调用函数时都不会重新分配Python中的默认值,它会被分配一次,每次调用函数时都会访问同一个对象。因此,如果您的默认值是可变对象,例如list
或dict
,则可以在每次调用时对其进行变更。
解决此问题的常见方法是执行以下操作:
class TestClass:
def __init__(self, arr=None):
self.arr = [] if arr is None else arr