我从我之前创建的单独文件中导入了一个函数。
在其中,我将变量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 - 如果您需要澄清,请询问。
答案 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中有三个不重叠的选项:在本地看;看看封闭的范围;全球看。没有合并它们,也没有查看调用堆栈。