python - 在 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 循环的范围是全局的而不是局部的吗?
在我写的其他函数中,变量的范围始终是本地的......
我正在寻找几个小时的答案,我希望我的问题不是太明显!再次感谢!
最好的菲利克斯
解决方案
一种简单的思考方式是列表是可变的,这意味着以下情况将成立:
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++ 或任何其他低级编程语言,则与传递引用相同。
推荐阅读
- javascript - Javascript改变全局变量的值
- ios - 介绍 MFMessageComposeViewController/了解 DispatchQueue.main.async
- swift - JWT Request Made 但它告诉请求不包含访问令牌
- chainer - 尝试使用带有 Chainer 的 Resnet50 预测单个图像时,我收到警告“A batch with no more than one sample ---”
- postgresql - 如何使用 SpringBoot + JPA 存储 PostgreSQL jsonb?
- python - 在python中裁剪一个体积(二维切片堆栈)
- excel - 我有一个 .txt 文件,当我将其保存为 csv 时,前导 0 不再存在
- wpf - GMap.NET WPF 标记计时器更新
- c# - AWS S3 如何将文件从存储桶移动到不同区域的另一个存储桶
- python - 为每次获取更改用户代理字符串