Python 参数值正确性
可能重复:Python 参数值正确性,python,list,Python,List,可能重复: 当我阅读以下讲义时: 我遇到了下面的例子。基本上,它声称: def bad_append(new_item, a_list=[]): a_list.append(new_item) return a_list 不是将项目附加到列表的最佳方式,因为在函数定义时对列表进行评估 相反,更好的选择是: def good_append(new_item, a_list=None): if a_list is None: a_list = []
当我阅读以下讲义时: 我遇到了下面的例子。基本上,它声称:
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
不是将项目附加到列表的最佳方式,因为在函数定义时对列表进行评估
相反,更好的选择是:
def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list
因为它在函数的运行时定义了变量
来自C语言背景的a_列表
不是一个局部变量吗?它如何存储从一个函数调用到另一个函数调用的值?此外,有人能详细说明为什么第二个例子比第一个好吗?在定义中定义函数有什么错?它似乎没有覆盖原始值或任何内容
谢谢 一个简单的答案是
def
语句创建一个对象,在执行objects时(当执行def
行时),将创建一个新的列表对象并附加到该对象(在本例中,该对象是一个函数)
在随后的执行过程中,您可能希望生成一个新的列表;但实际上,函数定义第一次运行时创建的同一对象仍然存在;该对象的所有“成员”都保持不变。这就是为什么它一直添加到同一个列表中
之所以认为它不好,是因为您可能期望从参数中得到的(即每次执行时都会生成一个新列表)不是语句所做的。这就是为什么更好的模式是传递None
或其他一些空白对象
考虑以下几点:
>>> bad_append('foo')
['foo']
>>> bad_append('bar')
['foo', 'bar']
>>> bad_append('zoo')
['foo', 'bar', 'zoo']
>>> bad_append('bar',[])
['bar']
>>> bad_append('bar') # what?
['foo', 'bar', 'zoo', 'bar']
正如您所看到的,当我传入一个新列表时,在下一次执行时,它不会保持不变;但是,在执行def时构建的原始列表仍然存在
有关更多信息,请参阅effbot。我想您可以阅读以下内容:看一看,我想这将是这个问题的第78个副本。