首页 > 解决方案 > Python - 列表在不使用“return”的情况下在函数外部更新

问题描述

我有一个列表,我将其作为参数提供给函数。在函数内部,我正在更改列表,但我没有使用return. 我正在运行该功能并随后打印列表。

预期结果:[]

实际结果:[5]

这怎么可能?

def foo(bar):
    for i in range(2):
        if bar == []:
            bar.append(4)
        else:
            bar[0] += 1
            
myvar = []  
foo(myvar)
print (myvar)

标签: pythonlistvariablesscopenamespaces

解决方案


因为空列表首先在内存位置创建,第二次它引用同一个列表而不是创建新列表。

  • 第一个 bar =[] 为空。
  • for 循环检查 bar 是否为空,向其添加 4。
  • 现在 bar = [4] 再次检查 bar == [] 但现在它的值为 4。所以它进入 else 部分并加 1。
  • 现在 bar 的值变为 5。
  • 在此过程中,它指的是相同的内存位置。

下面的示例将帮助您更好地理解它,

def foo (bar = []):
    bar.append('baz')
    return bar

foo()
['baz']


foo()

['baz', 'baz']


foo()
['baz', 'baz', 'baz']

每次调用 foo() 时,它都会将默认值“baz”附加到现有列表中。
这是因为,函数参数的默认值仅在定义函数时计算一次。因此,bar 参数仅在首次定义 foo() 时才初始化为其默认值(即空列表),但随后调用 foo() 将继续使用 bar 最初初始化的相同列表。


推荐阅读