有时,默认参数是空列表似乎是很自然的。还没有
在这些情况下,Python会产生意外的行为
..。
例如,我有一个函数:
def my_func(working_list=[]):
working_list.append("a")
print(working_list)
第一次调用默认列表时,它将起作用,但之后的调用将更新现有列表(带有一个
每次调用)并打印更新的版本。
那么,获得我想要的行为的pythonic方法是什么(每次调用都有一个新的列表)?
发布于 2008-12-14 11:27:30
def my_func(working_list=None):
if working_list is None:
working_list = []
# alternative:
# working_list = [] if working_list is None else working_list
working_list.append("a")
print(working_list)
文档
假设你应该使用
作为默认设置,并且显式
测试它
在函数体中。
发布于 2017-05-31 05:15:43
其他答案已经提供了所要求的直接解决方案,但是,由于这是新的Python程序员的一个非常常见的陷阱,因此有必要添加Python为什么会有这种行为的解释,这一点在中进行了很好的总结
Python搭便车指南
在
可变的默认参数
计算Python的默认参数
一次
在定义函数时,并不是每次都调用该函数(就像在Ruby中一样)。这意味着,如果使用可变的默认参数并对其进行修改,则
意志
并且已经为将来对该函数的所有调用改变了该对象。
发布于 2008-12-14 11:43:58
在这种情况下这并不重要,但您可以使用对象标识来测试是否没有:
if working_list is None: working_list = []
您还可以利用在python中定义布尔运算符或的方式:
working_list = working_list or []
尽管如果调用者给你一个空列表(算作false)作为工作时,这将是出乎意料的行为
_
列表,并希望您的函数修改他给它的列表。
https://stackoverflow.com/questions/366422
复制相似问题