【发布时间】:2020-04-30 15:01:06
【问题描述】:
在下面的代码 sn-p 中,我很困惑为什么可以使用列表的第一个元素来迭代另一个列表。有人可以解释一下为什么这不只是将整数 0 打印六次吗?
idx = [0,0,0]
junk = [1, 2, 3, 4, 5,6]
for idx[0] in junk:
print(idx[0])
【问题讨论】:
标签: python
在下面的代码 sn-p 中,我很困惑为什么可以使用列表的第一个元素来迭代另一个列表。有人可以解释一下为什么这不只是将整数 0 打印六次吗?
idx = [0,0,0]
junk = [1, 2, 3, 4, 5,6]
for idx[0] in junk:
print(idx[0])
【问题讨论】:
标签: python
你的代码看起来很奇怪。您可以通过这种方式将循环编号存储到idx[0] - 您可以通过打印它来查看:
idx = [0,0,0]
junk = [1, 2, 3, 4, 5,6]
for idx[0] in junk:
print(idx[0], idx)
得到
1 [1, 0, 0]
2 [2, 0, 0]
3 [3, 0, 0]
4 [4, 0, 0]
5 [5, 0, 0]
6 [6, 0, 0]
因此,您在每次迭代中都在积极地更改 idx[0] 的值 - 完成了多少次迭代取决于 junk 的值。
您可以创建一个“创造性/低效”的列表副本:
junk = [1, 2, 3, 4, 5,6]
idx = [0] * len(junk)
for i,idx[i] in enumerate(junk):
pass
虽然我不知道一个人需要什么:D
【讨论】:
因为 for 循环分配给循环变量(在您的情况下为 idx[0])。这在您的示例中是允许的。
您最终通过这样做修改了idx 数组:
idx = [0,0,0]
junk = [1, 2, 3, 4, 5,6]
for idx[0] in junk:
print(idx[0])
print(idx)
输出:
1
2
3
4
5
6
[6, 0, 0] # idx[0] is 6, the last value assigned to it by the for-loop
【讨论】:
for idx[0] in junk: 在每次迭代中更改idx[0]。添加print(idx) 以查看。使用for i in junk: 循环垃圾。
【讨论】:
因为它是迭代器协议。每次您遍历 junk 时,它都会将 idx[0] 设置为下一个值。
您可能认为它的行为类似于下面的代码;
idx = [0, 0, 0]
junk = [1, 2, 3, 4, 5, 6]
junk = iter(junk)
idx[0] = next(junk)
idx[0] = next(junk)
idx[0] = next(junk)
idx[0] = next(junk)
idx[0] = next(junk)
idx[0] = next(junk)
print(idx[0])
【讨论】: