Osc*_*ros 36 python parameters parameter-passing optional-parameters
可能重复:
Python中的"最小惊讶":可变默认参数
我对Python函数/方法中可选参数的工作原理感到困惑.
我有以下代码块:
>>> def F(a, b=[]):
... b.append(a)
... return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>
Run Code Online (Sandbox Code Playgroud)
为什么F(1)回归[0, 1]而不是[1]?
我的意思是,里面发生了什么?
Ben*_*den 43
几年前来自PyCon的好文档 - 解释了默认参数值.但基本上,由于列表是可变对象,并且在函数定义时计算关键字参数,因此每次调用该函数时,都会得到相同的默认值.
正确的方法是:
def F(a, b=None):
if b is None:
b = []
b.append(a)
return b
Run Code Online (Sandbox Code Playgroud)
直观地说,默认参数有点像函数对象上的成员变量.
执行函数定义时,将评估默认参数值.这意味着当定义函数时,表达式被计算一次,并且每个调用使用相同的"预先计算"值.这对于理解默认参数是可变对象(例如列表或字典)时尤其重要:如果函数修改对象(例如,通过将项附加到列表),则默认值实际上被修改.
http://docs.python.org/reference/compound_stmts.html#function
列表是一个可变对象; 你可以改变他们的内容.获取默认列表(或字典或集)的正确方法是在运行时创建它,而不是在函数内部:
def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list
Run Code Online (Sandbox Code Playgroud)