【问题标题】:'For' loop behaviour in PythonPython中的“For”循环行为
【发布时间】:2016-03-03 09:55:38
【问题描述】:

为什么下面的简单循环没有在循环结束时保存i 的值?

for i in range( 1, 10 ):
    print i
    i = i + 3

以上打印:

1
2
3
4
5
6
7
8
9

但它应该打印:

1
4
7

【问题讨论】:

  • 可能是related explanation
  • 为什么会这样呢?这完全违反直觉。
  • 你的变量被设置在“for”中,打印出来然后你做加法。如果你想要那个输出,你应该“打印 i+3”
  • 两票赞成主要基于意见?严重地?我没有看到基于此处的 anything 意见,除了 OP 对 for 的工作方式有错误的意见,但问题本身有一个明确的答案。如果您认为这是一个糟糕/无用的问题,请投反对票。
  • @Andrey 从 C for 循环的角度思考,其中更改主体内的迭代变量也会更改迭代

标签: python for-loop


【解决方案1】:

for sets i 每次迭代,到被迭代对象的下一个值。无论你在循环中设置i 到什么,都会被忽略。

来自for statement documentation

然后,该套件针对迭代器提供的每个项目执行一次,按索引升序排列。使用标准分配规则将每个项目依次分配到目标列表,然后执行套件。

i 是这里的目标列表,因此它被分配了来自range(1, 10) 对象的每个值。稍后将i 设置为其他值不会改变range(1, 10) 表达式产生的内容。

如果您想生成一个更改 i 的循环,请改用 while 循环;它每次都通过以下方式重新测试条件:

i = 1
while i < 10:
    print i
    i += 3

但是使用带有步骤的range() 会更容易,预先生成值

for i in range(1, 10, 3):
    print i

【讨论】:

  • 我该如何避免这种情况发生?
  • @NishantSingh 你可以在range(1,10,3)中控制步骤
  • 好答案!这里的关键点是没有进行测试。 python中的for循环是一个实际的循环,一个迭代,而不是其他语言的do-test-repeatfor循环。在java中,我认为,有for each循环,更类似于python循环;也许这样的命名会让循环的行为更加清晰,对吧?
  • 从理解的角度来看,我认为for x in iterable:foreach (x in iterable) { 几乎相同。这里唯一的问题是 i in range(1,10) 在 for 循环的上下文中不使用时实际上是一个布尔表达式。因此,有人可能会对 while 循环感到困惑。许多语言中的 for 循环有点误称 IMO。它们实际上是 while 循环,但带有一些语法糖。
  • @WillS:确实,这里可能有一些关于for i in range(1,10)while i in range(1,10) 之间的区别;他们做了两件非常不同的事情,尽管对于初学者来说,差异可能看起来很微妙和随意。
猜你喜欢
  • 1970-01-01
  • 2013-08-09
  • 2016-07-18
  • 2020-10-18
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多