在Python中,这个函数变量如何持续到下一次调用?
如果我运行这段代码,我希望看到[0]返回两次。相反,我看到[0,1]在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
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除了该方法之外无法访问时,它是如何持续存在的。我添加了几行-这是否有助于回答“为什么”?如果您对解释有具体问题,请随时提出更多要求。