在Python中更新列表:为什么函数中的for循环的作用域显然是全局的



我是一个绝对的Python新手,我在以下函数方面遇到了一些问题。我希望你能帮助我。非常感谢你事先的帮助!

我通过列表理解在目录中创建了一个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&quot-函数内的列表将仅为"0";影子;函数外实际列表的。在这种情况下,for循环的作用域是全局的而不是本地的吗

在我写的其他函数中,变量的范围总是局部的。。。

我已经找了好几个小时的答案了,我希望我的问题不要太明显!再次感谢!

最佳Felix

这是一个相当中间的主题。在一行中:Python是通过对象引用传递的。

这意味着什么

CCD_ 2是一个对象。一个对象有一个引用(把它想象成一个地址(,指向它在内存中的位置。若要访问对象,需要使用其引用。现在,这里是关键部分:

对于对象Python将其引用作为值传递

这意味着创建了对象的引用的副本,但新引用指向内存中的相同位置。

因此,如果使用引用的副本访问对象,则原始对象将被修改。

在函数中,zips_in_folder是一个变量,用于存储引用的新副本。以下行使用新副本访问原始对象:

zips_in_folder[index]=''.join(x(

但是,如果您决定重新分配存储引用的变量,则不会对对象或其原始引用执行任何操作,因为您刚刚重新分配了存储引用副本的变量,所以没有修改原始对象。意思是:

def reassign(a):
a = []
a = [1,0]
reassign(a)
print(a)  # output: [1,0]

一个简单的想法是列表是可变的,这意味着以下情况将成立:

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++或任何其他低级编程语言的知识,这与pass-by-reference相同。

相关内容

  • 没有找到相关文章

最新更新