2013-10-11 106 views
5

我今天有一个数学考试和对测试的额外信用的问题之一是关于变量的范围?

product = 1 
for i in range(1,7,2): 
    print i 
    product = product * i 
print i 
print product 

我们应该列出循环。这很容易的步骤;但它让我思考,为什么这个程序运行?第二个print i似乎不适合我。我认为i只存在for循环,然后get被销毁,所以当你调用第二个print i时,没有变量i,你会得到一个错误。

为什么i仍然是一个全局变量?

+0

使用'product * = i') – alexvassel

+0

我会的,这是我老师的考验。这是离散数学,所以没有很多人有编程经验,所以我可以理解他的理由,不要在这个时候引入太多的python /编程习语。 – spitfiredd

回答

9

魔鬼在细节

Naming and binding

A嵌段是作为一个单元执行的片Python程序文本。 以下是块:模块,函数体和类 的定义。

或者在简单的话,一个for loop不是块

范围定义一个块内的名称的可见性。如果在块中定义了本地变量 ,则其范围包括该块。如果 定义发生在功能块中,则范围扩展到包含在定义范围内的任何块 ,除非包含的块为名称引入了不同的绑定 。

所以定义的任何变量是从定义的点的module块的范围,function,或class定义的端可见。

为什么我仍然是一个全局变量?

从命名的说法,我会打电话给i一个全局变量,如果你的突出显示的代码是模块,而不是定义函数的一部分。

1

Python没有块范围。在函数中定义的任何变量只能从该点可见,直到函数结束。

+1

-1:'Python没有块范围.' ..这是不正确的。在Python中,块范围是模块,函数或类定义。 – Abhijit