2

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我发现我的类的init () 函数的字典参数默认为我之前在以前的实例中设置的值。我真的不明白这种行为,列表或基本变量似乎不会发生这种情况。示例代码:

class TestClass:
  def __init__(
    self,
    adir={},
    alist=[],
    avar=None
  ):
    print("input adir: " + str(adir)) #for test2, shows test1.mydir
    self.mydir = adir
    self.mylist = alist
    self.myvar = avar

test1 = TestClass()   
test1.mydir['a'] = 'A'
test1.mylist = ['foo'] 
test1.myvar = 5

test2 = TestClass()
print(test2.mydir) #has same value of test1!
print(test2.mylist)
print(test2.myvar)

输出如下所示: initializing test1 input adir: {} initializing test2 input adir: {'a': 'A'} {'a': 'A'} [] None 为什么 test2 的字典参数 (adir) 得到设置为 test1.mydir?特别是,为什么行为与其他可变类型(如列表)不同?

谢谢!

4

1 回答 1

2

正如 DSM 所说,不要修改可变的默认参数。改为这样做:

class TestClass:

  def __init__(self, adir=None, alist=None, avar=None):
    if alist is None:
      alist = []
    if adir is None:
      adir = {}
于 2012-07-03T19:34:03.743 回答