0

我从之前创建的单独文件中导入了一个函数。在其中我将变量声明numsnonlocal,然后使用它。因此,在这种情况下,我会给你一段我的代码和我的错误。

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 - 如果您需要澄清,请询问。

4

1 回答 1

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: 没有找到非本地 'nums' 的绑定"

这解释为help('nonlocal')

与“全局”语句中列出的名称不同,“非本地”语句中列出的名称必须引用封闭范围中的 预先存在的绑定(不能明确确定应该创建新绑定的范围 )。

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

情况并非如此global,因为无论谁打电话opening_questions(),我们都会在同一个地方寻找全球。

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

于 2017-08-04T22:14:16.983 回答