【问题标题】:For loop overriding outer variables instead of creating new onesFor循环覆盖外部变量而不是创建新变量
【发布时间】:2019-04-20 17:52:37
【问题描述】:

所以我一直在修补 Python 有一段时间了,就在我开始认为我已经掌握了一些东西的时候,我偶然发现了另一个我错过的基本概念。所以..

拥有这个基本的 for(foreach) 循环:

x = 15
for x in range(10):
    continue
print(x)

我预期的“x”值是 15,但结果却是 9

C 中相同的代码 sn-p 返回 x 的原始值 - 15

#include <stdio.h>

int main(void) 
{
  int x = 15;
  for (int x = 0; x < 10; x++)
  {
    continue;
  }
  printf("%d", x);
  return 0;
}

我似乎无法弄清楚变量范围是如何在这里工作的。 由于 x 是在 for 循环范围之外声明的,不应该在循环的生命周期内创建一个新的局部变量吗? 那么为什么 Python 版本会覆盖 'x' 呢?

【问题讨论】:

  • 我不知道c,但是在python中,任何变量总是会取它分配的值
  • 在继续查看会发生什么之前尝试添加打印语句print(x)
  • @Nathan 添加打印语句将打印 x 的每个值,从 0 到 9,但我不明白为什么它会覆盖 x 而不是创建新的局部变量,例如 C .
  • for 循环不会在 Python 中创建新范围。有关范围规则,请参阅例如 stackoverflow.com/questions/291978/…
  • @ThierryLathuille 谢谢!很棒的帖子,我应该早点找到的!

标签: python c for-loop scope


【解决方案1】:

这不一样。在 C 中,您显式创建了一个新变量,而在 Python 中,您在 for 范围内重用名称,最终覆盖之前的值。

所以 C 等价的真的是:

#include <stdio.h>

int main(void) 
{
  int x = 15;
  for (x = 0; x < 10; ++x)
  {
    continue;
  }
  --x; // To accommodate the different behavior of the range loop
  printf("%d", x);
  return 0;
}

不要忘记,在 Python 中,变量只是动态创建的字典中的条目,而在 C 中,它们是独立的静态项。

【讨论】:

  • x &lt; 9 其实
  • 它是 x
  • "它是x &lt; 10,但不应该有最终增量"...是的,所以它是x &lt; 9...哈哈
  • 否,因为循环中有 10 次迭代。如果我们在循环内做某事而不是继续,我们会看到 10 次通过,而不是 9 次。
  • 是的,如果循环中有return 0,那么就不会发生迭代,你可以想象你想要什么,但 OP 写的是一个空循环。事实上,GCC 甚至将该程序优化为printf("%d", 9);
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多