首页 > 解决方案 > 在 Python 中更新列表:为什么我的 for 循环在函数中的范围显然是全局的?

问题描述

我是一个绝对的 Python-Newbe,我在使用以下功能时遇到了一些麻烦。我希望你能帮助我。非常感谢您提前提供的帮助!

我通过列表理解在目录中创建了一个 zip 文件列表:

zips_in_folder = [file for file in os.listdir(my_path) if file.endswith('.zip')]

然后我想定义一个函数,用“-”替换列表中每个元素中某个索引处的某个字符:

print(zips_in_folder)
def replacer_zip_names(r_index, replacer, zips_in_folder=zips_in_folder):
    for index, element in enumerate(zips_in_folder): 
        x = list(element)
        x[r_index] = replacer
        zips_in_folder[index]=''.join(x)
replacer_zip_names(5,"-")

print(zips_in_folder)

输出:

['12345#6', '22345#6']
['12345-6', '22345-6']

该函数有效,但我无法理解:为什么我的函数会更新实际列表“zips_in_folder”。我认为函数内的“zips_in_folder”列表只是函数外实际列表的“影子”。在这种情况下,for 循环的范围是全局的而不是局部的吗?

在我写的其他函数中,变量的范围始终是本地的......

我正在寻找几个小时的答案,我希望我的问题不是太明显!再次感谢!

最好的菲利克斯

标签: pythonfunctionfor-loopscopeglobal

解决方案


一种简单的思考方式是列表是可变的,这意味着以下情况将成立:

a = [1, 2, 3]
b = a           # a, b are referring to the same object
a[1] = 20       # b now is [1, 20, 3]

那是因为列表是 python 中的对象,而不是原始变量,所以该函数会更改“原始”列表,即它不会制作它的本地副本。

对于任何类,无论是用户定义的还是其他类都是如此:操作对象的函数不会复制该对象,它会更改传递给它的“原始”对象。

如果您了解 c++ 或任何其他低级编程语言,则与传递引用相同。


推荐阅读