Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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_Python 3.x - Fatal编程技术网

在Python中,这个函数变量如何持续到下一次调用?

在Python中,这个函数变量如何持续到下一次调用?,python,python-3.x,Python,Python 3.x,如果我运行这段代码,我希望看到[0]返回两次。相反,我看到[0,1] def append(flist=[]): # append the length of a list to the list flist.append(len(flist)) return flist print(append()) print(append()) 为什么会发生这种情况?表达式不应该因为作用域而重置吗?如果flist存在于函数外部,如何访问它 这个例子来自问题“Q:下面的第二条ap

如果我运行这段代码,我希望看到[0]返回两次。相反,我看到[0,1]

def append(flist=[]):
    # append the length of a list to the list
    flist.append(len(flist))
    return flist

print(append())
print(append())
为什么会发生这种情况?表达式不应该因为作用域而重置吗?如果flist存在于函数外部,如何访问它


这个例子来自问题“Q:下面的第二条append()语句将打印出什么?”。它确实包含了一个简短的解释,但我不明白这是怎么可能的。我能想到的任何分析内存的方法都没有告诉我这些值,但我也不确定有什么合适的工具来解决这个问题。查看locals()或dir()之类的内容似乎不会产生任何有意义的结果

如果您尝试这样做,PyCharm之类的编辑器实际上会警告您

Pycharm说:“默认参数值是可变的。”

这就是问题所在:您提供的默认值(空列表)是一个实际列表,与任何其他列表一样,您可以更改它,如果多个变量将该列表作为一个值,这些更改将显示在所有变量中

因此,要修复该代码(并获得您想要的行为),您需要执行以下操作:

def append(flist=None):
    # initialise if needed
    if flist is None:
        flist = []
    # append the length of a list to the list
    flist.append(len(flist))
    return flist

print(append())
print(append())
这为您提供了预期的行为,因为对于这两个调用,没有传递任何列表,因此flist为None,并且在每次传递时为其分配一个新的空列表,而不是两次传递初始默认列表(第一次运行时为空,第二次运行时包含
0

如原问题所述,
append
函数的作用域不存在。相反,默认值与函数定义在同一范围内。因此,在这种情况下,在全球范围内


无论何时调用函数,此全局定义的列表都会被修改,这就是为什么预期作用域为函数的值会持续存在的原因。

谢谢Grismar!你能解释一下为什么会这样吗?我无法理解当范围flist除了该方法之外无法访问时,它是如何持续存在的。我添加了几行-这是否有助于回答“为什么”?如果您对解释有具体问题,请随时提出更多要求。