我对Python中的默认参数感到困惑。这是我的代码:
#!/usr/bin/env python
import sys
class Node(object):
def __init__(self, ID=str(), items=[]):
self.ID = ID
self.items = items
if __name__ == '__main__':
a = Node('1')
b = Node('2')
b.items.append('sth.')
c = Node('3')
print a.items
print b.items
print c.items
The output is:
['sth.']
['sth.']
['sth.']
我只是更改了b实例。为什么所有实例都被更改?
答案 0 :(得分:4)
这是一个参考案例。由于列表items
是可变的(可以使用内部方法直接更改),因此您在任何函数中对其所做的任何更改都会反映在对它的所有引用中。
例如,如果您有以下代码:
def f(x):
x.append(5)
a = [1, 2, 3]
f(a)
# a is now [1, 2, 3, 4], even in the global scope
这是因为a
是一个可变列表,因此它通过引用传递。
因此,当您使用items = []
时,您在程序启动时创建一个空白列表,但每次创建新实例时都不。相反,每个实例引用相同的列表,在“声明”类时创建。因此,由于每个实例引用相同的列表,因此它们都会更改。
要解决此问题,请将构造函数更改为:
def __init__(self, ID=str(), items=None): # you can also use '' instead of str()
if not items: items = []
# everything else
一些很好的链接可以更好地解释这个/以不同的方式:
还有很多其他问题,只需搜索[python] None as default argument
。