在Python 3中使用导入模块的范围错误

时间:2016-12-20 21:45:45

标签: scope syntax-error python-import python-nonlocal

我从我之前创建的单独文件中导入了一个函数。 在其中,我将变量nums声明为nonlocal,然后使用它。因此,在上下文中,我将向您提供我的代码片段和错误。

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 个答案:

答案 0 :(得分:0)

对我来说,这归结为这个问题的工作原因:

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:没有绑定非本地&#39; nums&#39;发现&#34;

help('nonlocal')解释:

  

&#34;非本地&#34;中列出的名称声明,与a中列出的声明不同   &#34;全球&#34;声明,必须参考 预先存在的绑定    封闭范围 (应在其中创建新绑定的范围)    无法明确确定 )。

(我的重点。)在不起作用的代码中,nums的绑定是模糊的,因为我们不知道谁可以在运行时调用opening_questions()(调用者可能不定义nums)。并且在封闭范围(文本)中找不到绑定。

对于global 就是这种情况,因为无论是谁调用opening_questions(),我们都会查看 相同 为全球化的地方。

混淆可能来自动态范围语言,它首先在本地查找,然后在调用堆栈中查找,最后在全局范围内查找。在Python中有三个不重叠的选项:在本地看;看看封闭的范围;全球看。没有合并它们,也没有查看调用堆栈。