簡體   English   中英

__main__ 和 python 中的范圍

[英]__main__ and scoping in python

我對以下行為感到驚訝:

def main():
    print "%s" % foo

if __name__ == "__main__":
    foo = "bar"
    main()

即模塊函數可以訪問__main__封閉變量。 對它的解釋是什么?

當前模塊全局作用域中的變量在模塊中的任何地方都是可見的——這個規則也適用於__main__模塊。

來自Guido 的教程

在執行過程中的任何時候,至少有三個嵌套的作用域可以直接訪問其命名空間:

  • 首先搜索的最里面的范圍包含本地名稱
  • 從最近的封閉范圍開始搜索的任何封閉函數的范圍包含非本地名稱,但也包含非全局名稱
  • 倒數第二個范圍包含當前模塊的全局名稱
  • 最外面的范圍(最后搜索)是包含內置名稱的命名空間

這里的事情是:

if __name__ == "__main__":
    foo = "bar"

在該腳本中定義了一個名為 foo 的全局變量。 所以該模塊的任何功能都可以訪問它。

上面列出的這段代碼對模塊來說是全局的,而不是在任何函數內部。

foo 是一個模塊全局變量(它不在任何函數中)。 模塊內的所有范圍都可以訪問它。

在python中有全局作用域,函數有自己的作用域。 所以你在 name==main 下定義 foo,它在全局范圍內。 此外,在函數中使用尚未聲明的變量也不是錯誤,如果它將在調用函數時聲明。

正如 sinelaw 指出的那樣,消除這種煩惱和無意中的錯誤的方法是使用函數。 這個函數可以在 'if main :' 中,如下所示:

if __name__ == "__main__":
    def mainlet():
        foo = "bar"
    mainlet()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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