【问题标题】:Why is the list overwritten by the last item when using the same name for the loop variable?为什么在对循环变量使用相同名称时,列表会被最后一项覆盖?
【发布时间】:2022-01-23 20:47:05
【问题描述】:

我试图在 Python 中运行这个脚本,但我发现了一些非常奇怪的东西:

test = ['file.txt', 'file1.mkv', 'file2.mkv']                                  
for test in test:
    print(test)    
print(test)

一旦我运行了这个脚本,我就会期待这样的输出:

file.txt
file1.mkv
file2.mkv
['file.txt', 'file1.mkv', 'file2.mkv']

我得到的是这样的:

file.txt
file1.mkv
file2.mkv
file2.mkv

我不明白为什么最后一行输出是“file2.mkv”。

在脚本中我说要打印test 中的每个值,然后打印test。我从来没有写过更改变量test,所以没有理由输出不是我一开始定义的初始变量test

我知道我可能错了,但我想了解原因。

【问题讨论】:

  • 在循环测试中是局部变量test(列表中的每个元素test)。循环后,test 是顶层变量test(列表)
  • 尝试使用for t in test 看看你是否能理解发生了什么。
  • 或许你可以尝试跑到这里看看是怎么回事——pythontutor.com

标签: python list for-loop scope


【解决方案1】:

Python 没有与其他语言相同的块逻辑。在循环中声明的变量在循环之后仍然有效。

for i in range(5):
    pass
print(i)

将输出4

实际发生的事情是这样的:

# loop
i = 0
i = 1
i = 2
i = 3
i = 4
# end loop
print(i)  # print(4)

因为您将循环变量命名为与数组相同的名称,所以您将使用单个值覆盖数组变量。这就是 test 在循环之后包含 file2.mkv 的原因。

This questions 提供了有关此主题的更多详细信息。

【讨论】:

    【解决方案2】:

    试试这个:

    test = ['file.txt', 'file1.mkv', 'file2.mkv']                                  
    for item in test:
        print(item)    
    print(test)
    

    您的最后一次打印是打印循环中的最后一项,您称为 test 以及您的列表。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2014-09-06
      • 2021-08-25
      • 2012-12-29
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多