2012-04-16 17 views
4

Python代码:为什么变量在Python中比C中活的更长(有更大的范围)?

for i in xrange(10): 
    for j in xrange(5): 
     pass 

# The for-loop ends, but i,j still live on 
print i,j # 9, 4 

C代码:

for(int i=0; i<=10; i++) 
    for(int =0; j<=5; j++) 
     ; 

// The for-loop ends, so i,j can't be accessed, right? 
printf("%d, %d", i, j); // won't compile 

因此,在Python变量将连for循环结束后生活呢?

+0

我认为你的代码不是等价的。我对Python并不熟悉,但是如果'i'是在python中已经声明的,而不是在'for'之外,而在C中,'i'是for循环的本地。 – Ankit 2012-04-16 01:00:10

+0

等效的C代码应该在for循环(int i,j;)之外声明i和j,然后将它们简单地分配给for循环。 – Joe 2012-04-16 01:02:12

+0

@Joe我认为你的意思是_could_,而不是_should_。关键是在Python中,你不能声明一个局部于循环范围的变量。 – agf 2012-04-16 01:02:56

回答

8

只有函数,模块和类定义的主体在Python中描述了作用域。其他控制结构不。

关于此的一些基本信息位于Python教程的Classes页面的Python Scopes and Namespaces部分。一个重要部分:

虽然范围是静态确定的,但它们是动态使用的。在执行过程中的任何时间,至少有三个嵌套范围,其命名空间是可以直接访问:

  • 最里面的范围,这是第一次搜索,包含本地名
  • 的任何封闭的功能范围,这是从最近的封闭范围开始搜索,包含非本地名称,也包含非全局名称
  • 倒数第二个作用域包含当前模块的全局名称
  • 最后一个作用域(最后搜索)是包含已构建 - 名字
+2

是的,legb规则,也来自“Learning Python”一书:http://books.google.com.hk/books?id=1HxWGezDZcgC&pg=PA412&lpg=PA412&dq=python+LGB+scope&source=bl&ots=LjHh-Mfbr0&sig= JKatyA0rvni3wkjBRSN99iDyS5w&HL = EN&SA = X&EI = i26LT8r-EIiyiQfE2N2xBg&redir_esc = Y&HL = ZH-CN&的SourceID = cndr#v = onepage&q =蟒蛇%20LGB%20scope&F =假 – WooParadog 2012-04-16 01:00:13

+0

@WooParadog该链接不为我 工作(没有的话在书显示),加上它不是英文。 [以下是books.google.com上的链接](http://books.google.com/books?id=1HxWGezDZcgC&pg=PA412&lpg=PA412&dq=python+LGB+scope#v=onepage&q=python%20LGB%20scope&f=false ) – agf 2012-04-16 01:38:47

相关问题