簡體   English   中英

從另一個腳本導入函數時出現NameError嗎?

[英]NameError when importing function from another script?

我很難從另一個腳本導入函數。 以下兩個腳本位於同一目錄中。 為什么另一個腳本中的函數不能處理具有相同名稱( arr )的對象?

偶數

def find_evens():
    return [x for x in arr if x % 2 == 0]

if __name__ == '__main__':

    arr = list(range(11))

    print(find_evens())

import_evens.py

from evens import find_evens

if __name__ == '__main__':

    arr = list(range(11))

    print(find_evens())

追溯

Traceback (most recent call last):
  File "C:\Users\user\Desktop\import_evens.py", line 7, in <module>
    find_evens()
  File "C:\Users\user\Desktop\evens.py", line 2, in find_evens
    return [x for x in arr if x % 2 == 0]
NameError: name 'arr' is not defined

python中的模塊具有單獨的命名空間。 合格名稱evens.arrimport_evens.arr是單獨的實體。 在每個模塊中,僅使用名稱arr指向該模塊的本地名稱,因此import_evens arr實際上是import_evens.arr

由於您要在if __name__ ...內部定義arr ,因此名稱arr僅是在執行的模塊中定義的。 從未定義過evens.arr名稱。

此外,沒有真正的全球名稱的概念。 名稱可以是模塊的全局名稱,因此名稱中的所有實體都可以使用它。 其他任何模塊仍必須將其尋址為a_module.global_variables_name 也可以from a_module import global_variables_name ,但這只是導入它並將其綁定到新的本地名稱的糖。

# same as `from a_module import global_variables_name`
import a_module
global_variables_name = a_module.global_variables_name

您所顯示的內容最好通過函數的參數來完成:

# evens.py
def find_evens(arr):
    return [x for x in arr if x % 2 == 0]

# import_evens.py
if __name__ == '__main__':
    arr = list(range(11))
    print(find_evens(arr))

如果您認為最好使用全局變量,但又不了解語言如何使用全局變量,那么最好不要使用全局變量。

暫無
暫無

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

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