python从外部访问主程序变量

时间:2015-09-24 08:07:56

标签: python

我是python的新手,想知道为什么它可以从外部访问主程序中定义的变量,但不能在自定义函数中。

def f():
    print(l)

if __name__ == '__main__':
    l = [1,2,3]
    f()         # output: [1,2,3]

但在函数中执行时会遇到错误

def f1():
    l1 = [1,2,3]
    f2()

def f2():
    print(l1)    # error: global name 'l1' is not defined

if __name__ == '__main__':
    f1()        

第一个例子让我很困惑,AFAIK,它是C / C ++或其他语言中的错误,因为我们无法引用未定义的变量。那么为什么它在这里合法以及为什么第二个例子不合法呢?

3 个答案:

答案 0 :(得分:3)

if块不是变量的范围,它只是有条件地声明它。如果您的程序以__main__运行(即正在执行的主要脚本),l将被声明为全局范围变量,因此在f执行时可用。它与:

相同
if True:
    l = []

def f1():
    print(l)

与以下内容相同:

l = []

def f1():
    print(l)

在函数之前或之后是否声明l并不重要,它只是在函数体执行时声明它。

但是,在函数f1中声明变量会将其范围限定为f1

答案 1 :(得分:0)

第一个示例中的

FILE_COMMON是全局定义的,因此在所有函数中都是自动的(只读,请注意),只要在函数范围内执行l = 1,它就会是局部变量,除非你明确添加l(这通常是不好的做法)。

答案 2 :(得分:0)

让我们分解你的代码:

首先,定义一个名为f1()的函数。并在l1中定义名为f1()的变量。 f1会调用f2()

def f1():
    l1 = [1,2,3]
    f2()

然后,这是另一个名为f2()的函数,这将打印l1

def f2():
    print(l1)

然后,您将调用f1()

if __name__ == '__main__':
    f1()        

出了什么问题?

来自help(global)

  

"全球"声明是一个适用于整个声明的声明   当前代码块。这意味着列出的标识符是   解释为全局变量。

     

分配到全球是不可能的   变量没有"全局",尽管自由变量可以参考   没有被声明为全局的全局变量。

如您所见,您应该在定义global之前使用l1。所以试试这个:

def f1():
    global l1
    l1 = [1,2,3]
    f2()

def f2():
    print(l1)

if __name__ == '__main__':
    f1()

演示:

[1, 2, 3]

您还可以使用l1作为这样的参数:

def f1():
    global l1
    l1 = [1,2,3]
    f2(l1)

def f2(arg):
    print(arg)

if __name__ == '__main__':
    f1()

没关系,arg是变量,你可以在函数中使用它。