python - 导入涉及另一个函数python的函数

标签 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 函数的一部分并导入 func_two,但不能单独使用它导入状态?

最佳答案

函数被赋予一个对全局命名空间的引用。该命名空间是它们在其中定义的模块。

因为 func_twodo_the_job 都定义在同一个模块中,所以它们都“存在于”该命名空间中。在 func_two 的主体中使用名称 do_the_job 将通过查看 func_two 的全局变量来解决,这将找到另一个函数。

当你导入一个模块时,整个模块总是被加载;您可以在 sys.modules 映射中找到它。一旦加载(只需要完成一次),导入命名空间就会更新以添加您导入的名称;这些只是对导入模块命名空间中对象的引用。

因此 from my_py import func_two import 确保加载了 my_py 模块(存储在 sys.modules['my_py'] 中)并且然后将名称 func_two 添加到您的当前 命名空间以引用 sys.modules['my_py'].func_two

但是,您没有将 do_the_job 导入到您当前的 namespace 中,因此您不能使用该名称。它不是您的全局命名空间的一部分。要么显式导入它,要么通过 sys.modules['my_py'].do_the_job 引用它。

您可能想了解 Python 名称的工作原理,我衷心推荐您阅读 Ned Batchelder's Facts and myths about Python names and values .它不直接涉及导入,但确实提供了重要的见解,可帮助您更好地了解这种特定情况。

关于python - 导入涉及另一个函数python的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103236/

相关文章:

python - 为什么导入子流程会改变我的输出?

python - 使用 importlib.import_module 处理导入模块引发的异常

python-3.x - 如何在 Python 中为导入设置别名?

python - 为什么在 Keras 子类化 API 中,永远不会调用 call 方法,而是通过调用此类的对象来传递输入?

python - 如何将 "with"与对象列表一起使用

python - 在 for 循环中

python - 在 Node js模块中执行child_process

Python:当 readline() 使用 Popen() 调用的进程时收到垃圾

python - 即使安装后也无法在ubuntu中的python-2.7.12中导入z3

python - 如何使用python对图像进行base64编码