具有默认参数的Python函数显示意外行为

时间:2013-09-07 16:31:47

标签: python

以下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. 这种行为背后的理由是什么? (这似乎让我感到困惑)

1 个答案:

答案 0 :(得分:1)

默认值是一个表达式,在定义/编译函数时为evaluated only once。它可能存储在函数对象的某个位置,因此当此表达式求值为像列表这样的可变对象时,您将获得所描述的效果。我不知道这个的理性,但它是python的一个特性。

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

In [12]: f.func_defaults
Out[12]: ([], 123)