[英]python access main program variable from outside
我是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 ++或其他一些語言中的錯誤,因為我們無法引用未定義的變量。 那么為什么它在這里是合法的,為什么第二個例子不合法呢?
if
塊不是變量的范圍,它只是有條件地聲明它。 如果您的程序作為__main__
運行(即正在執行的主腳本),則l
將被聲明為全局范圍變量,因此在執行f
時可用。 它與以下相同:
if True:
l = []
def f1():
print(l)
這與以下相同:
l = []
def f1():
print(l)
無論l
是在函數之前還是之后聲明,唯一重要的是它是在函數體執行時聲明的 。
但是,在函數f1
聲明變量將其范圍限定為f1
。
l
在第一個例子中l
是全局定義的,因此自動在所有函數中(只讀,請注意),只要在函數范圍內執行l = 1,它將是一個局部變量,除非你明確地添加一個global l
(通常是不好的做法)。
讓我們分解您的代碼:
首先,定義一個名為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”語句是一個聲明,它包含整個當前代碼塊。 這意味着列出的標識符將被解釋為全局變量。
沒有“全局”就不可能分配給全局變量,盡管自由變量可以引用全局變量而不被聲明為全局變量。
如您所見,在定義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
是一個變量,你可以在函數中使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.