For循环覆盖外部变量,而不是创建新变量

时间:2018-11-17 23:27:05

标签: python c for-loop scope

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

具有以下基本的for(foreach)循环:

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

我期望的“ x”值是 15 ,但我却得到了 9

C中相同的代码段返回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”?

1 个答案:

答案 0 :(得分:3)

这是不一样的。在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中,它们是独立的静态项。