我是一个绝对的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"-函数内的列表将仅为"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相同。