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