gpt4 book ai didi

python - 为什么我可以在 Python for 循环中对迭代器和序列使用相同的名称?

转载 作者:IT老高 更新时间:2023-10-28 21:32:29 25 4
gpt4 key购买 nike

这更像是一个概念性问题。我最近在 Python 中看到了一段代码(它在 2.7 中工作,它也可能在 2.5 中运行),其中 for 循环对两个列表使用相同的名称迭代和列表中的项目,这让我觉得既不好的做法又根本不应该工作。

例如:

x = [1,2,3,4,5]
for x in x:
print x
print x

产量:

1
2
3
4
5
5

现在,对我来说,打印的最后一个值是循环中分配给 x 的最后一个值是有道理的,但我不明白为什么你可以为你的两个部分使用相同的变量名for 循环并使其按预期运行。它们在不同的范围内吗?允许这样的事情工作的引擎盖下发生了什么?

最佳答案

dis 告诉我们什么:

Python 3.4.1 (default, May 19 2014, 13:10:29)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from dis import dis
>>> dis("""x = [1,2,3,4,5]
... for x in x:
... print(x)
... print(x)""")

1 0 LOAD_CONST 0 (1)
3 LOAD_CONST 1 (2)
6 LOAD_CONST 2 (3)
9 LOAD_CONST 3 (4)
12 LOAD_CONST 4 (5)
15 BUILD_LIST 5
18 STORE_NAME 0 (x)

2 21 SETUP_LOOP 24 (to 48)
24 LOAD_NAME 0 (x)
27 GET_ITER
>> 28 FOR_ITER 16 (to 47)
31 STORE_NAME 0 (x)

3 34 LOAD_NAME 1 (print)
37 LOAD_NAME 0 (x)
40 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
43 POP_TOP
44 JUMP_ABSOLUTE 28
>> 47 POP_BLOCK

4 >> 48 LOAD_NAME 1 (print)
51 LOAD_NAME 0 (x)
54 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
57 POP_TOP
58 LOAD_CONST 5 (None)
61 RETURN_VALUE

关键位是第 2 和 3 部分 - 我们从 x (24 LOAD_NAME 0 (x)) 中加载值,然后我们得到它的迭代器 (27 GET_ITER)并开始迭代它(28 FOR_ITER)。 Python 永远不会再返回加载迭代器

除此之外:这样做没有任何意义,因为它已经有了迭代器,并且作为 Abhijit points out in his answer , Section 7.3 of Python's specification实际上需要这种行为)。

当名称 x 被覆盖以指向以前称为 x 的列表中的每个值时,Python 在查找迭代器时没有任何问题,因为它从不需要再次查看名称 x 以完成迭代协议(protocol)。

关于python - 为什么我可以在 Python for 循环中对迭代器和序列使用相同的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24689967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com