首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当从另一个脚本导入函数时,NameError?

当从另一个脚本导入函数时,NameError?
EN

Stack Overflow用户
提问于 2016-10-12 14:32:37
回答 1查看 1.5K关注 0票数 0

我在从另一个脚本导入函数时遇到了困难。下面的两个脚本都位于同一个目录中。为什么来自另一个脚本的函数不能处理同名的对象(arr)?

evens.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
from evens import find_evens

if __name__ == '__main__':

    arr = list(range(11))

    print(find_evens())

溯源

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-12 14:52:34

python中的模块有单独的名称空间。限定名evens.arrimport_evens.arr是独立的实体。在每个模块中,只使用名称arr就会指向它的本地名称,因此import_evens中的arr实际上是import_evens.arr

由于您在arr中定义了if __name__ ...,所以名称arr仅是在执行模块中定义的。evens.arr的名称从未定义过。

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

代码语言:javascript
运行
复制
# same as `from a_module import global_variables_name`
import a_module
global_variables_name = a_module.global_variables_name

您所显示的最好是通过函数的参数来完成:

代码语言:javascript
运行
复制
# 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))

如果您认为使用全局变量更好,但不理解一种语言如何使用全局变量,最好不要使用全局变量。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40001314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档