<p>通过使用<a href="http://docs.python.org/2/library/functions.html#globals" rel="nofollow">^{<cd1>}</a>或<a href="http://docs.python.org/2/library/functions.html#locals" rel="nofollow">^{<cd2>}</a>返回的字典(如果合适的话),您可以通过变量名称的字符串表示来访问变量,但是如果您修改<code>locals()</code>字典,您可能会发现事情的行为与您期望的不一样,如文档中所述,并由这个答案底部的代码片段演示。还可以通过字符串标签分别使用<code>setattr(self, 'some_variable_name', value)</code>、<code>setattr(ClassName, 'some_variable_name', value)</code>或<code>setattr(ModuleName, 'some_variable_name', value)</code>修改实例、类或模块变量,其中self、ClassName和ModuleName分别是对类实例、类和模块的引用。最后,通过使用<code>exec</code>执行包含在字符串中的代码,您总是可以实现您想要的。例如:</p>
<pre><code>for i in range(5):
temp = i
exec('var%d = temp' % i)
print var0, var1, var2, var3, var4
</code></pre>
<p>将打印<code>0 1 2 3 4</code>。你知道吗</p>
<p>但你到底为什么要做这些事?</em>如果需要将任意字符串映射到值,则可以创建并使用字典。如果像在你的例子中那样,你不是在处理任意字符串,而是处理一系列变量,这些变量只在名称的末尾有一个整数索引,那么<em>使用一个列表</em>,因为<em>列表就是用来做这个的。</em></p>
<p>用我在第一段中描述的任何一种方式做事情都是令人困惑和毫无意义的,而且我从未见过用真正的代码来做。你知道吗</p>
<p>我想再次强调,正如Ashwini Chaudhary已经指出的,这里重要的一点是,没有理由通过字符串引用变量,因为如果需要将字符串映射到值,你可以简单地使用字典——如果你使用<code>globals()</code>或<code>locals()</code>,这正是你间接做的事情,因为这些函数都返回字典。你知道吗</p>
<hr/>
<p>不管怎样,作为附言,我提到如果你修改locals()字典,事情就不太正常了,这并不是要像文档中提到的那样修改的,这句话</p>
<ul>
<li><code>Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.</code></li>
</ul>
<p>好吧,下面是这一点的一个例子,希望它能阻止任何人尝试这种方法:</p>
<pre><code>var1 = 'asdf'
def test1():
var1 = 'ghjkl'
print globals()['var2']
print locals()['var2']
test1()
def test2():
globals()['var2'] = 'qwerty'
locals()['var2'] = 'uiop'
print var2
test2()
</code></pre>
<p>如果运行上面的代码,会打印什么?令我惊讶的是:</p>
<pre><code>asdf
ghjkl
qwerty
</code></pre>
<p>第一个测试的行为与我预期的一样-globals中的查找查找在函数外部指定的值,locals中的查找查找在本地指定的值。第二个测试是令人惊讶的-尽管我们在globals中指定了一个值,在local中指定了一个值,但按名称局部引用变量会找到我们在globals字典中放置的值,而不是locals字典中的值。你知道吗</p>