循环变量覆盖全局变量

时间:2015-07-21 16:15:47

标签: python namespaces

在python中,为什么循环变量会覆盖已定义的全局变量?将一个循环变量放入模块的全局命名空间而不是仅用于循环的新本地命名空间似乎违反直觉。这是一个显示我正在谈论的内容的例子:

c = 3.14

print("before loop c = {}".format(c))
for c in range(3):
    print("in loop c = {}".format(c))
print("after loop c = {}".format(c))

运行此代码将打印出来:

before loop c = 3.14
in loop c = 0
in loop c = 1
in loop c = 2
after loop c = 2

重复使用这样的名称几乎肯定是错误的编码风格,但它可能会在大型模块中意外发生,并导致全局变量被定义为您不期望它们的位置。例如,如果我这样做:

def f(x):
     print("x is {}".format(c)) # finger slipped, wrote c instead of x

for c in range(3):
    print("c is {}".format(c))

for a in "test":
    f(a)

我会得到:

c is 0
c is 1
c is 2
x is 2
x is 2
x is 2
x is 2

This question似乎表明for循环在设计上没有自己的命名空间。根据相对于程序执行顺序运行循环的时间,它可能导致错误的原因是什么?

0 个答案:

没有答案