簡體   English   中英

python從外部訪問主程序變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM