我知道不应该使用可变的默认参数值在 Python 中(有一些例外),因为该值仅在定义函数时计算和存储一次,而不是在以后每次调用函数时计算和存储。
我对此的理解是这样的(使用下面的例子;请原谅我的不精确的语言,因为我只是Python编程的初学者,因此陷入了我教科书的“函数”章节):
def f(x = [1, 2, 3]):
x.append(4)
print(x)
f()
f()
1) 定义了函数 f,并且 x(f 中的局部变量)采用默认变量 [1, 2, 3](甚至在调用函数之前)
2) 当调用 f() 时,由于没有参数传递给 x,x 仍然是 [1, 2, 3],并且 x 继续具有其默认值
3) x 通过append 就地修改,变成[1, 2, 3, 4],并按原样打印
然而,这就是我困惑的地方。我假设:
4) 当 f 结束时,x 被销毁(在堆栈中或无论你如何称呼它)并且不再与列表对象 [1, 2, 3, 4]** 关联
5) 列表对象 [1, 2, 3, 4] 被回收,因为不再有变量引用它
所以,
6) 当第二次调用 f() 时,我希望 Python 输出一个错误,因为 x 现在不再有与之关联的值。换句话说,当 Python 被回收/销毁时,如何重用上次评估的默认值?
感谢您的所有帮助和解释!
** this understanding I got from Ned Batchelder's page on variable name assignment (see below)