【发布时间】: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 类似于附加/修改 l 和 baz 的元素并导致类似的行为,但它没有 - 它们每个 foo 打印相同的值调用(除非提供了非默认参数)。
因此标题中的问题。在我的示例中,我认为差异是由可迭代数据类型与不可迭代数据类型引起的。
【问题讨论】:
标签: python immutability default-parameters mutability