从另一个脚本导入函数时的NameError?

时间:2016-10-12 14:32:37

标签: python python-import

我无法从其他脚本导入函数。以下两个脚本都在同一目录中。为什么来自另一个脚本的函数不能处理具有相同名称的对象(arr)?

evens.py

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

1 个答案:

答案 0 :(得分:3)

python中的模块具有单独的命名空间。限定名称evens.arrimport_evens.arr是单独的实体。在每个模块中,仅使用名称arr引用其本地名称,因此arr中的import_evens实际上是import_evens.arr

由于您在arr内定义if __name__ ...,因此名称arr仅在已执行模块中定义。永远不会定义名称evens.arr

此外,没有真正全球名称的概念。名称可以是模块的全局名称,因此其中的所有实体都可以使用它。任何其他模块仍然必须将其作为a_module.global_variables_name来解决。它也可以导入为from a_module import global_variables_name,但这只是导入它并将其绑定到 new 本地名称的糖。

# 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))

如果您认为为此设置全局变量更好但不了解语言如何使用全局变量,那么最好不要使用全局变量。