导入涉及另一个函数的函数 python
importing a function which involves another function python
我在同一个“.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
函数并成功运行。然而,post的原因来了,当我写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
都在同一模块中定义,所以它们都 'live' 在该命名空间中。在 func_two
的主体中使用名称 do_the_job
将通过查看 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。它不直接涉及导入,但确实提供了重要的见解,可帮助您更好地了解这种特定情况。
我在同一个“.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
函数并成功运行。然而,post的原因来了,当我写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
都在同一模块中定义,所以它们都 'live' 在该命名空间中。在 func_two
的主体中使用名称 do_the_job
将通过查看 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。它不直接涉及导入,但确实提供了重要的见解,可帮助您更好地了解这种特定情况。