范围混乱。无法解释o / p中的打印语句的顺序

时间:2013-07-01 02:10:25

标签: python

为什么第一个印刷语句不能给我'5 = 3'?这是John Guttag的书。无法理解它。

顺便说一下:

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()

4 个答案:

答案 0 :(得分:1)

您对x所做的所有更改仅限于本地作用范围f。除非您声明x global(global x),否则x不会从全局空间中的3更改。

答案 1 :(得分:1)

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

f(x)调用期间,定义了另外两个函数,然后执行x=x+1。所以第一个打印语句是3 = 4

这应该足以帮助你弄清楚其余部分。

答案 2 :(得分:0)

From Python docs

  

全局语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量。

例如,如果目标是更改全局g,则x函数应如下所示:

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

答案 3 :(得分:0)

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