非常奇妙的循环行为:列出更改的标识。发生了什么事?

2024-03-28 23:55:29 发布

您现在位置:Python中文网/ 问答频道 /正文

做了这些之后

list2 = [x for x in range(10)]

list1 = [ x for x in range(10,20)]

 for k, list1 in enumerate([list1,list2]):
    for number, entry in enumerate(list1):
        print number, entry 

突然id(list2)==id(list1)计算为真?到底发生了什么?循环运行时,第一个输出似乎与预期不符:

0 10,1 11,2 12,…0,1 2,2 3,。。。你知道吗

第二个结果是:

0 0,1 1,2 2。。。你知道吗

这怎么可能?你知道吗

只需将代码更改为:

list2 = [x for x in range(10)]

list1 = [ x for x in range(10,20)]

摆脱这种行为。你知道吗

 for k, NEWVAR in enumerate([list1,list2]):
    for number, entry in enumerate(list1):
        print number, entry 

Tags: 代码inidnumberforrangeprintentry
3条回答

你写道:

list1 = [ x for x in range(10,20)]

然后:

for k, list1 in ...

您对两个不同但混合的对象使用相同的名称list1!不会有什么好结果的。你知道吗

只需为循环使用不同的名称:

for k, l in enumerate([list1,list2]):
    for number, entry in enumerate(l):

请记住,在Python中,粗略地说,只有两个作用域:

  • 模块范围和
  • 功能范围。你知道吗

在for循环中,最后一个赋值给list1的值是list2,这就是等式成立的原因

您希望for循环中的变量被限制在循环中,但事实并非如此。例如:

for i in range(0, 2):
    pass

print(i)

输出:

1

您正在for循环中重新分配list1

for k, list1 in enumerate([list1,list2]):

这意味着在上一次迭代中,您隐式地执行list1 = list2

docs

enumerate() returns a tuple containing a count (from start which defaults to 0) and the values obtained from iterating over sequence

相关问题 更多 >