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

费利克斯

我是绝对的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循环的范围是全局的,而不是局部的?

在其他函数中,我编写了变量的范围始终是局部的...

我已经搜索了几个小时了,希望我的问题不太明显!再次感谢!

最佳菲利克斯

卡里姆H

这是一个相当中间的话题。一行: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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么更新全局变量在导入函数中定义的函数中不起作用

来自分类Dev

为什么__init__显然是可选的?

来自分类Dev

Haskell:为什么不能在id的域显然是该函数中所需类型的超集的另一个函数中使用id?

来自分类Dev

Python作用域:我在函数中复制了一个列表对象,并修改了重复对象,但原始对象被更改了。为什么?

来自分类Dev

为什么在python 3类的实例中,对列表的更改是全局的?

来自分类Dev

为什么在此代码段中,箭头函数的外部作用域在showList中而不是forEach中?

来自分类Dev

Python变量作用域在循环示例中

来自分类Dev

更改JScrollPane中的JScrollBars值的问题:90显然是幻数

来自分类Dev

无法检查bash中的校验和---显然是错误的语法?

来自分类Dev

为什么嵌套的 for 循环在 Python 中不起作用?

来自分类Dev

python for循环中的作用域:为什么索引减少

来自分类Dev

Python 中的循环不更新数组,为什么?

来自分类Dev

python中eval函数的作用域

来自分类Dev

函数的作用域作为 Python 中的对象

来自分类Dev

For 和 while 循环在全局定义的函数中不起作用

来自分类Dev

为什么我的def函数在Python中不起作用?

来自分类Dev

为什么python中的sum函数不起作用?

来自分类Dev

std :: ifstream :: in和std :: ios :: in有什么区别?(显然是C ++中std :: ifstream的openmode标志)

来自分类Dev

为什么在PHP上的匿名函数中无法从父/外部作用域访问变量?

来自分类Dev

朱莉娅(Julia)作用域:为什么此函数修改全局变量?

来自分类Dev

为什么条件块中的函数声明被提升到Chrome而不是Firefox中的函数作用域?

来自分类Dev

为什么此函数在 Python 中不返回列表?

来自分类Dev

与深度无关,更新函数中的全局嵌套列表变量

来自分类Dev

Javascript中的作用域链,并在全局作用域中调用嵌套函数

来自分类Dev

在模型展示中禁用全局作用域?

来自分类Dev

为什么javascript在一个函数而不是另一个函数中从父作用域访问值?

来自分类Dev

For循环在python函数中不起作用

来自分类Dev

为什么全局变量不会随同一个全局变量中的全局函数一起更新?安卓/Java

来自分类Dev

C ++ 11中lambda函数的作用域是什么(代理)

Related 相关文章

  1. 1

    为什么更新全局变量在导入函数中定义的函数中不起作用

  2. 2

    为什么__init__显然是可选的?

  3. 3

    Haskell:为什么不能在id的域显然是该函数中所需类型的超集的另一个函数中使用id?

  4. 4

    Python作用域:我在函数中复制了一个列表对象,并修改了重复对象,但原始对象被更改了。为什么?

  5. 5

    为什么在python 3类的实例中,对列表的更改是全局的?

  6. 6

    为什么在此代码段中,箭头函数的外部作用域在showList中而不是forEach中?

  7. 7

    Python变量作用域在循环示例中

  8. 8

    更改JScrollPane中的JScrollBars值的问题:90显然是幻数

  9. 9

    无法检查bash中的校验和---显然是错误的语法?

  10. 10

    为什么嵌套的 for 循环在 Python 中不起作用?

  11. 11

    python for循环中的作用域:为什么索引减少

  12. 12

    Python 中的循环不更新数组,为什么?

  13. 13

    python中eval函数的作用域

  14. 14

    函数的作用域作为 Python 中的对象

  15. 15

    For 和 while 循环在全局定义的函数中不起作用

  16. 16

    为什么我的def函数在Python中不起作用?

  17. 17

    为什么python中的sum函数不起作用?

  18. 18

    std :: ifstream :: in和std :: ios :: in有什么区别?(显然是C ++中std :: ifstream的openmode标志)

  19. 19

    为什么在PHP上的匿名函数中无法从父/外部作用域访问变量?

  20. 20

    朱莉娅(Julia)作用域:为什么此函数修改全局变量?

  21. 21

    为什么条件块中的函数声明被提升到Chrome而不是Firefox中的函数作用域?

  22. 22

    为什么此函数在 Python 中不返回列表?

  23. 23

    与深度无关,更新函数中的全局嵌套列表变量

  24. 24

    Javascript中的作用域链,并在全局作用域中调用嵌套函数

  25. 25

    在模型展示中禁用全局作用域?

  26. 26

    为什么javascript在一个函数而不是另一个函数中从父作用域访问值?

  27. 27

    For循环在python函数中不起作用

  28. 28

    为什么全局变量不会随同一个全局变量中的全局函数一起更新?安卓/Java

  29. 29

    C ++ 11中lambda函数的作用域是什么(代理)

热门标签

归档