<p>很多关于这个问题的不清楚的问题用OP解决了。见答案编辑。它可以归结为(导入)钩住局部变量(变量、def、类),以便在定义中使用它们。在</p>
<p>请看下面的答案和内联评论什么是什么和为什么。在</p>
<pre><code># take 1, create local variable 'foo' with value 6. Not in function.
# >>> code is executed in local-scope <<<
varName = 'foo'
varValue = 42
localVarToEvaluate = varName + ' = varValue'
try:
exec(localVarToEvaluate) # (0) dict item becomes {varName : varValue}
print (localVarToEvaluate) # (1) prints > foo = varValue < dict item
except Exception as err:
print(str(err))
if 'foo' in locals():
print(locals()['foo']) # (2) prints > 42 < value
print(foo) # (3) prints > 42 < value
print("'foo' OK:", foo) # (4) prints > 'foo' OK: 42 < stringtext, value
# take 2, create local variable 'bar' with value 42
def func2(self):
# >>> code executed inside function and not local-scope <<<
varName = 'bar'
varValue = 42
localVar2Evaluate = varName + ' = varValue'
try:
exec(localVar2Evaluate) # (5) dict item becomes {varName : varValue}
print (localVar2Evaluate) # (6) prints > bar = varValue < dict item
except Exception as err:
print(str(err))
print ('local-scope :', '\n', locals()) # (7) {'bar': 42, 'localVar2Evaluate': 'bar = varValue', 'varValue': 42, 'varName': 'bar'}
if 'bar' in locals():
print(locals()['bar']) # (1)
print(bar) # (2) < - python is not looking here in the locals() but inside the def for variable `bar` which is not made unless you give it access (hook or reference) via e.g. self.
print("'bar' OK:", bar) # (3)
# pass # uncomment any line above
x = 'a scotch... lets drink.. mystery solved!'
bar = "the local 'bar' variable is now available inside def func2().. It is: %s" % x
func2(bar)
</code></pre>
<p>如您所见,我(import)创建了一个指向本地变量的钩子,varName'bar'将在定义中使用<code>self</code>。它可以是任何名称t.b.h.请参见<code>self</code>上的pydocs,等等</p>
<p>结果是:</p>
^{pr2}$
<p>如果<code>print('\n\n', locals())</code>在func()下面,您将得到以下打印结果:</p>
<ol>
<li>'bar':“本地'bar'变量现在在def中可用
函数2()。。它是:一杯苏格兰威士忌。。。让我们喝。。密谋解决了!”在</li>
<li>“localVarToEvaluate”:“foo=varValue”</li>
<li>“varValue”:42</li>
<li>“福”:42</li>
<li>'varName':'foo'</li>
<li>“x”:“一杯苏格兰威士忌。。。让我们喝。。密谋解决了在</li>
<li>“func2”:“<;”“function func2 at 0x000002B070027F28”>;“#不带“outside”>;”。在</li>
</ol>
<p>在第7项中,您可以看到func2链接。在</p>
<p><strong>更新4:</strong></p>
<p>在Python2.7.16和3.5.2之间切换显示locals()dict没有变化,globals()dict有一个变化,如下所示。在</p>
<p>在2.7中:<code>'variables': set([('bar', 42), ('foo', 6)])</code></p>
<p>在3.5中:<code>'variables': {('bar', 42), ('foo', 6)}</code></p>
<p>。。。这个<code>set()</code>在我看来,它不再像您在3.5中提到的那样有效。在</p>
<p>我试过改编你的剧本:</p>
<pre><code>import sys
print (sys.version)
variables = {('foo', 6), ('bar', 42)}
def func():
for varData in variables:
varName, varValue = varData
localVarToEvaluate = varName + ' = varValue'
try:
exec(localVarToEvaluate)
print ('t2\n', locals())
except Exception as err:
print(str(err))
if varName not in globals():
print("Variable names '", varName, "can't be found in global scope!")
if 'foo' in globals():
print("'foo' OK:", foo) # exception here
else:
print("'foo' not available!")
if 'bar' in globals():
print("'bar' OK:", bar)
else:
print("'bar' not available!")
print ('t1\n', globals())
func()
</code></pre>
<p>然后。。。可能还是执行官。所以我禁用了运行<code>func()</code>,并且<code>globals()</code>中的差别仍然存在。所以我认为这是<code>globals()</code>函数的区别,而不是{<cd10>}。在</p>