Fır*_*lur 0 python python-import python-2.7
我在同一个".py"文件中编写两个单独的函数时遇到了一个奇怪的情况.我使用的是python 2.7.12.这是我的代码:
def do_the_job(n, list):
for i in range(2, n):
a = list[i - 1]
b = list[i - 2]
ap_me = list[i- a] + list[i - b]
list.append(ap_me)
return list
def func_two(n, k):
counter = 0
list = [1, 1]
do_the_job(n,list)
for i in range(n):
if list[i] >= k:
counter += 1
return counter
Run Code Online (Sandbox Code Playgroud)
然后导入,我写入from my_py import func_two控制台.当我写func_two(10,3)它导入do_the_job函数也成功运行.但是,这里有帖子的原因,当我写入do_the_job(7,[1,1])控制台时,它出错了NameError: name 'do_the_job' is not defined.
为什么我可以使用do_the_job函数作为func_two导入函数的一部分func_two,但不能单独使用它具有相同的导入状态?
函数被赋予对全局命名空间的引用.该命名空间是它们定义的模块.
因为无论func_two并且do_the_job在同一模块中的定义,他们在该命名空间都"活".使用do_the_job正文中的名称func_two将通过查看全局变量来解决,func_two并找到其他函数.
导入模块时,始终加载整个模块; 你可以在sys.modules映射中找到它.加载后(只需要执行一次),导入命名空间将更新以添加您导入的名称; 这些只是对导入的模块命名空间中的对象的引用.
因此from my_py import func_two导入确保my_py加载(存储在sys.modules['my_py'])模块,然后将名称func_two添加到当前名称空间以引用sys.modules['my_py'].func_two.
但是,您没有导入do_the_job当前的命名空间,因此您无法使用该名称.它不是您的全局命名空间的一部分.要么明确地导入它,要么通过它引用它sys.modules['my_py'].do_the_job.
您可能想要了解Python名称的工作原理,我衷心建议您阅读Ned Batchelder 关于Python名称和值的事实和神话.它并不直接涵盖导入,但它确实提供了重要的见解,可以帮助您更好地了解这种特定情况.
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |