我是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 ++或其他语言中的错误,因为我们无法引用未定义的变量。那么为什么它在这里合法以及为什么第二个例子不合法呢?
答案 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
是变量,你可以在函数中使用它。