Python如何从外部访问主程序变量

3

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

第一个例子真的让我困惑了,据我所知,在C/C++或其他语言中,我们不能引用未定义的变量,因此为什么这里是合法的,而第二个例子却不合法呢?

3个回答

5

if块并没有限定变量的作用域,它只是有条件地声明它。如果你的程序正在运行作为__main__(即正在执行的主脚本),那么l将被声明为全局作用域变量,并且在f被执行时可用。这与下面的代码是相同的:

if True:
    l = []

def f1():
    print(l)

这与以下代码等价:

l = []

def f1():
    print(l)

无论变量 l 是在函数前还是后声明,它只要在函数体被执行时已经被声明即可,这一点很重要。
然而,若将变量声明放在函数 f1 内部,则该变量的作用域仅限于函数 f1 内。

1

让我们分解你的代码:

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

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

接下来,这里是另一个名为f2()的函数,它将打印l1

def f2():
    print(l1)

然后,您将调用f1()
if __name__ == '__main__':
    f1()        

有什么问题吗?

help(global) 来看:

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

如果没有 "global" 语句,则无法对全局变量进行赋值,尽管自由变量可能引用未声明为全局变量的全局变量。

正如你所看到的,你应该在定义 l1 之前使用 global。所以试试这个:

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 是一个变量,你可以在函数中使用它。


0

l 在第一个例子中是全局定义的,因此在所有函数中都自动存在(只读的,要知道),一旦你在函数范围内执行 l=1,它将成为一个局部变量,除非你显式地添加 global l(这通常是不好的做法)。


1
“只读”并不完全正确。如果值是可变的,您可以修改该值。例如,l.append(4) 将正常工作。 - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接