【问题标题】:Why is this dictionary not emptied when the function is called again? [duplicate]为什么再次调用函数时这个字典没有清空? [复制]
【发布时间】:2012-03-22 14:51:26
【问题描述】:

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

当我注意到如果你有一个空的字典作为函数的输入时,我正在处理字典,在下次调用函数时在函数中输入它之后,字典不再为空。我很难解释我的意思,所以我希望下面的代码能解释我的意思:

>>> def test(input, dct={}):
...     dct[input] = 'test'
...     print dct 
... 
>>> test('a')
{'a': 'test'}
>>> test('b')
{'a': 'test', 'b': 'test'}

我的问题归结为:为什么在这个示例脚本中,当执行 test('b') 时,它会打印出来

{'a':'test', 'b':'test'}

而不是

{'b':test'}

【问题讨论】:

  • 请参阅Python Tutorial 中的“重要警告”。我们每周至少收到一次这个问题...
  • 对不起,我没有找到它,我没有搜索“Python 中的 Least Astonishment”或“可变默认参数”
  • 在 SO 上有数百个问题。经常出现这种情况说明好像确实很难找,但是不知道怎么改善。
  • 问题是这种现象第一次遇到不容易搜索。我认为将这个问题标记下来并关闭它有点苛刻(在撰写本文时有 4 票关闭)。
  • @MattH:我认为关闭它很好,因为它是重复的。而且我并不是想“让它下来”。

标签: python function dictionary


【解决方案1】:

因为这里dct={} 使dct 的默认值始终指向同一个对象,而不是每次都创建一个空字典。这是 Python 程序员可能陷入的常见陷阱。

This article详细解释了这个问题。

【讨论】:

    【解决方案2】:

    python 中的函数参数只初始化一次。如果你希望它是每次调用的,只需在你的函数中将它初始化为一个空字典。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 2019-06-28
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2016-07-02
      相关资源
      最近更新 更多