【问题标题】:In python __init__ dictionary arguments defaulting to previous class values [duplicate]在 python __init__ 字典参数默认为以前的类值[重复]
【发布时间】:2012-07-04 07:00:39
【问题描述】:

可能重复:
“Least Astonishment” in Python: The Mutable Default Argument

我发现我的类的 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)

输出如下所示: 初始化测试1 输入地址:{} 初始化测试2 输入 adir: {'a': 'A'} {'a':'A'} [] 没有 为什么将 test2 的字典参数 (adir) 设置为 test1.mydir?特别是,为什么其行为与其他可变类型(如列表)不同?

谢谢!

【问题讨论】:

  • mydirmylist 行为不同的唯一原因是您设置了test1.mydir元素,但您替换了test1.mylist。否则这又是可变的默认参数问题。

标签: python class dictionary python-2.7 instance-variables


【解决方案1】:

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

class TestClass:

  def __init__(self, adir=None, alist=None, avar=None):
    if alist is None:
      alist = []
    if adir is None:
      adir = {}

【讨论】:

  • +无穷大。 (ahem - 几乎)始终使用 None 作为默认值
  • 非常感谢,我以前从未意识到这个问题......现在我知道了这个问题,我做了一些谷歌搜索。对于后人来说,this article 对这里发生的事情的讨论还不错。
  • 和实例变量的相同问题...使用 self.alist = {} is alist is None else alist
猜你喜欢
  • 2021-07-27
  • 2016-06-25
  • 2017-01-27
  • 2018-06-30
  • 1970-01-01
  • 2017-09-06
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多