从另一个脚本导入函数时出现 NameError?
NameError when importing function from another script?
我在从另一个脚本导入函数时遇到困难。下面的两个脚本都在同一个目录中。为什么另一个脚本中的函数不能处理同名对象 (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
python 中的模块具有单独的命名空间。限定名称 evens.arr
和 import_evens.arr
是独立的实体。在每个模块中,仅使用名称 arr
指的是它的本地名称,因此 import_evens
中的 arr
实际上是 import_evens.arr
.
由于您在 if __name__ ...
中定义 arr
,名称 arr
仅在 executed 模块中定义。名称 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))
如果你认为为此有全局变量比较好,但又不了解语言如何使用全局变量,那么最好不要有全局变量。
我在从另一个脚本导入函数时遇到困难。下面的两个脚本都在同一个目录中。为什么另一个脚本中的函数不能处理同名对象 (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
python 中的模块具有单独的命名空间。限定名称 evens.arr
和 import_evens.arr
是独立的实体。在每个模块中,仅使用名称 arr
指的是它的本地名称,因此 import_evens
中的 arr
实际上是 import_evens.arr
.
由于您在 if __name__ ...
中定义 arr
,名称 arr
仅在 executed 模块中定义。名称 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))
如果你认为为此有全局变量比较好,但又不了解语言如何使用全局变量,那么最好不要有全局变量。