我是绝对的Python-Newbe,并且在使用以下函数时遇到了一些麻烦。我希望你能帮助我。非常感谢您的提前帮助!
我已经通过list-comprehension在目录中创建了一个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循环的范围是全局的,而不是局部的?
在其他函数中,我编写了变量的范围始终是局部的...
我已经搜索了几个小时了,希望我的问题不太明显!再次感谢!
最佳菲利克斯
这是一个相当中间的话题。一行:Python是通过对象引用。
zips_in_folder
是一个对象。一个对象有一个引用(认为它像一个地址),指向它在内存中的位置。要访问对象,您需要使用其引用。现在,这是关键部分:
对于对象, Python将其引用作为值传递
这意味着将创建对象引用的副本,但是新引用又指向内存中的同一位置。
因此,如果使用引用的副本访问对象,则原始对象将被修改。
在您的函数中,zips_in_folder
是一个变量,用于存储引用的新副本。下一行使用新副本访问原始对象:
zips_in_folder [index] =''。join(x)
但是,如果您决定重新分配存储引用的变量,则不会对该对象或其原始引用执行任何操作,因为您只是重新分配了存储引用副本的变量,所以没有修改原始对象。意思是:
def reassign(a):
a = []
a = [1,0]
reassign(a)
print(a) # output: [1,0]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句