Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 参数值正确性_Python_List - Fatal编程技术网

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个副本。