【问题标题】:Why do different Python keyword argument types behave differently with multiple function calls?为什么不同的 Python 关键字参数类型在多个函数调用中表现不同?
【发布时间】:2022-10-15 15:02:48
【问题描述】:

我正在阅读 this very informative question and answer 并第一次了解到这种行为:调用

def foo(l=[]):
    l.append(1)
    print(l)

foo()
foo()
foo([])
foo()

印刷

[1]
[1,1]
[1]
[1,1,1]

我认为这很简洁,并想尝试使用其他变量类型作为默认参数。

跑步

import math
def foo(l=[],bar=0,baz={"z":0},bap="a"):
    l.append(1)
    bar+=1
    baz["z"]+=1
    bap=chr(ord(bap)+1)
    print(locals())

foo()
foo()
foo([],math.pi,{"z":0},"?")
foo()

印刷

{'l': [1], 'bar': 1, 'baz': {'z': 1}, 'bap': 'b'}
{'l': [1, 1], 'bar': 1, 'baz': {'z': 2}, 'bap': 'b'}
{'l': [1], 'bar': 4.141592653589793, 'baz': {'z': 1}, 'bap': '@'}
{'l': [1, 1, 1], 'bar': 1, 'baz': {'z': 3}, 'bap': 'b'}

这让我完全措手不及。我期待增加整数 bar 和字符 bap 类似于附加/修改 lbaz 的元素并导致类似的行为,但它没有 - 它们每个 foo 打印相同的值调用(除非提供了非默认参数)。

因此标题中的问题。在我的示例中,我认为差异是由可迭代数据类型与不可迭代数据类型引起的。

【问题讨论】:

    标签: python immutability default-parameters mutability


    【解决方案1】:

    我从another informative posthelpful link 那里了解到我的怀疑是脱靶的。该问题不是由可迭代类型与不可迭代类型引起的。

    默认参数行为的差异发生是因为我选择的一些默认参数是可变的llistbazdict)等不可变barintbapstr)。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2022-01-22
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2013-06-01
      相关资源
      最近更新 更多