导入涉及另一个函数python

时间:2016-12-12 14:36:59

标签: python python-2.7 python-import

我在同一个“.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

然后进行导入,我将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的{​​{1}}函数的一部分,但不能单独使用它并具有相同的导入状态?

1 个答案:

答案 0 :(得分:7)

为函数提供对全局命名空间的引用。该命名空间是他们定义的模块。

由于func_twodo_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's Facts and myths about Python names and values。它并不直接涵盖导入,但它确实提供了重要的见解,可以帮助您更好地了解这种特定情况。