2013-07-01 56 views
1

中打印语句的顺序为什么第一个打印语句不给我'5 = 3'?这是John Guttag的书。不能让我的头靠近它。范围混乱。无法解释o/p

它看起来像这样的方式:

3 = 4 
2 = 4 
1 = abc 
4 = 4 
5 = 3 
6 = <function g at 0x026B22F0> 
1 = abc 

脚本:

def f(x): 
    def g(): 
     x = 'abc' 
     print '1 =',x 
    def h(): 
     z = x 
     print '2 =',z 
    x = x+1 
    print '3 =',x 
    h() 
    g() 
    print '4 =', x 
    return g 

x = 3 
z = f(x) 

print '5 =',x 
print '6 =',z 
z() 
+6

修复您的缩进 – simonzack

+0

它给您带来了什么? –

回答

1

定义一个函数不会执行它,所以在定义f之后,执行x=3。调用函数f(x)并将结果分配给z。

在调用f(x)期间,定义了两个函数,然后执行x=x+1。所以第一印刷声明是3 = 4

这应该足以帮助您找出其余的问题。

+0

我没有意识到在'z = f(x)中调用f(x)会执行该函数。但是现在我可以看到,一旦f(x)被调用,它必须打印f函数体内的内容。谢谢。 – COOLBEANS

0

From Python docs

全局声明是适用于整个当前代码块的声明。这意味着列出的标识符将被解释为全局变量。如果没有全局变量,将不可能分配一个全局变量,尽管自由变量可能会引用全局变量而不被声明为全局变量。

例如,g功能应该是这样的,如果我们的目标是改变全球x

def g(): 
    global x 
    x = 'abc' 
    print '1 =',x 
1

所有你做x的变化仅限于功能f的局部范围。除非您声明x全局(global x),否则x将不会在全局空间中从3更改。

0

因为您在获得第一个顶级打印语句之前调用f(x),所以第一个打印语句是在f中执行的第一个语句。这解释了与表面词汇顺序的所有偏差。

+0

这解释得很好。我没有意识到这个调用会执行这个函数,但是一旦我想到它,它就有意义了。谢谢 – COOLBEANS