在 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 中创建)导入模块时出现问题

导入类中的模块,但是在类方法中使用模块时出现NameError

导入模块时出现离子3路径错误