0

以下python代码:

def test_function(a = []):
    a.append('x')
    print(a)

test_function()
test_function()

印刷:

['x']
['x', 'x']

似乎a=[]默认赋值只使用一次,之后a被视为函数的属性,除非在再次调用函数时重新赋值(例如test_function(a=['hello']))。该行为在 Python2.x 和 3.x 之间共享,因此我认为它不被视为设计缺陷。

我想知道:

  1. 这种行为的机制是什么?
  2. 这种行为背后的原因是什么?(这对我来说似乎很困惑)
4

1 回答 1

1

默认值是一个表达式,在定义/编译函数时只计算一次。它可能存储在函数对象中的某个位置,因此当此表达式计算为一个可变对象(如列表)时,您会得到您所描述的效果。我不知道这样做的合理性,但它是python的一个特性。

In [11]: def f(x = [], y = 123):
    ...:     pass

In [12]: f.func_defaults
Out[12]: ([], 123)
于 2013-09-07T16:34:50.117 回答