1.此声明将如何工作?
j for i in range(5)
示例:
x1=(j for i in range(5))
迭代的时候会得到5个4,为什么不会得到01234,就像我们用i代替j。1.这句话是怎么说的
a = [0, 1, 2, 3] for a[-1] in a: print(a[-1]) 0 1 2 2
mrfwxfqh1#
第一个示例是生成器表达式(括号是必需的,所以你展示的第一个版本实际上没有意义)生成器表达式重复地产生j,它在你展示的代码中没有定义,但是从你的描述来看,它在你测试的环境中已经有了4的值,所以你会反复看到这个值,你从来不用i的值,它是从range中获取值的。对于另一个循环,for a[-1] in a不断地重新绑定列表中的最后一个值,然后打印它。for循环在for和in之间赋值给目标,通常使用局部变量名(比如i或j),但是你 * 可以 * 使用更复杂的赋值目标,比如self.index,或者像本例中的a[-1],在你迭代列表的时候重写它的值是非常奇怪的,但这并不禁止。3永远不会被打印出来,因为之前的赋值语句在列表中都覆盖了它,最后一次迭代不会改变打印出来的值,因为a[-1]是赋值给它自己的。
j
4
i
range
for a[-1] in a
for
in
self.index
a[-1]
3
bjg7j2ky2#
你的第一个问题在迭代时会产生错误,因为没有定义j。如果你从那里得到任何响应,你可能已经在你的生成器上定义了j的值,在你的代码中听起来像是4。关于你的第二个问题:当你遇到这样的情况时
for i in a: ...
实际上,你在每个周期都在这样做:i=a[0], i=a[1], ....当你写a[-1] in a时,它等于:并且每次都要修改a的最后一个元素,所以最后,列表的最后一个元素是2。
i=a[0], i=a[1], ...
a[-1] in a
a
2
2条答案
按热度按时间mrfwxfqh1#
第一个示例是生成器表达式(括号是必需的,所以你展示的第一个版本实际上没有意义)生成器表达式重复地产生
j
,它在你展示的代码中没有定义,但是从你的描述来看,它在你测试的环境中已经有了4
的值,所以你会反复看到这个值,你从来不用i
的值,它是从range
中获取值的。对于另一个循环,
for a[-1] in a
不断地重新绑定列表中的最后一个值,然后打印它。for循环在
for
和in
之间赋值给目标,通常使用局部变量名(比如i
或j
),但是你 * 可以 * 使用更复杂的赋值目标,比如self.index
,或者像本例中的a[-1]
,在你迭代列表的时候重写它的值是非常奇怪的,但这并不禁止。3
永远不会被打印出来,因为之前的赋值语句在列表中都覆盖了它,最后一次迭代不会改变打印出来的值,因为a[-1]
是赋值给它自己的。bjg7j2ky2#
你的第一个问题在迭代时会产生错误,因为没有定义
j
。如果你从那里得到任何响应,你可能已经在你的生成器上定义了j
的值,在你的代码中听起来像是4
。关于你的第二个问题:
当你遇到这样的情况时
实际上,你在每个周期都在这样做:
i=a[0], i=a[1], ...
.当你写
a[-1] in a
时,它等于:并且每次都要修改a
的最后一个元素,所以最后,列表的最后一个元素是2
。