在 Python 3 中使用导入的模块时出现范围错误
Posted
技术标签:
【中文标题】在 Python 3 中使用导入的模块时出现范围错误【英文标题】:Scope error working with imported module in Python 3 【发布时间】:2017-05-06 05:25:18 【问题描述】:我有一个从我之前创建的单独文件中导入的函数。
在其中我将变量nums
声明为nonlocal
,然后使用它。因此,在这种情况下,我将为您提供我的代码和错误的 sn-p。
cwd = os.getcwd()
sys.path.append(os.path.abspath(cwd + "/myfunctions"))
from opening_questions import opening_questions
def runing_app():
nums = []
opening_questions()
def core_app(jpm):... # this is what I am trying to execute from all this.
for jpm in nums:
core_process = multiprocessing.Process(target=core_app, args=(jpm,))
core_process.start()
print('RAN')
break
runing_app()
在opening_questions()
我声明nonlocal nums
并尝试在我的函数中使用nums
。
这是我得到的错误:
Traceback (most recent call last):
File "/home/gdfelt/Python projects/test versions/test(current work)/testX.py", line 22, in <module>
from opening_questions import opening_questions
File "/home/gdfelt/Python projects/test versions/test(current work)/myfunctions/opening_questions.py", line 19
nonlocal nums
SyntaxError: no binding for nonlocal 'nums' found
在我从单独的文件运行之前,这段代码运行良好。 我需要什么才能让这段代码工作?我使用的是 python 3.5 -- 如果您需要澄清,请询问。
【问题讨论】:
【参考方案1】:对我来说,这归结为有效的问题:
def runing_app():
def opening_questions():
nonlocal nums
nums += " World!"
nums = "Hello"
opening_questions()
print(nums)
runing_app()
但这不是:
def opening_questions():
nonlocal nums
nums += " World!"
def runing_app():
nums = "Hello"
opening_questions()
print(nums)
runing_app()
无论我们是在改变还是仅仅查看nums
,我们都会收到消息:
SyntaxError: no binding for nonlocal 'nums' found"
help('nonlocal')
解释:
在“非本地”语句中列出的名称,与在 “全局”语句,必须引用 预先存在的绑定 封闭范围(应在其中创建新绑定的范围 无法明确确定)。
(我的重点。)在不起作用的代码中,nums
的绑定是模棱两可的,因为我们不知道谁可能在运行时调用opening_questions()
(调用者可能没有定义nums
)。并且在封闭范围(文本)中找不到绑定。
这不是global
的情况,因为无论谁打电话给opening_questions()
,我们都会看到相同 em> 适合全球的地方。
混淆可能来自动态范围语言,它们首先在本地查找,然后在调用堆栈上,最后在全局范围内。在 Python 中有三个不重叠的选项:本地查找;查看封闭范围;放眼全球。没有组合它们,也没有查找调用堆栈。
【讨论】:
以上是关于在 Python 3 中使用导入的模块时出现范围错误的主要内容,如果未能解决你的问题,请参考以下文章
导入python的winreg模块时出现ImportError
Python - 导入新模块时出现问题 - libgmail
拔出 Raspberry Pi 后导入模块时出现 Python EOFerror
在 Spark 中的 EMR 上使用 --py-files 从 .zip 文件(使用 zipfile 包在 python 中创建)导入模块时出现问题