<p>动态生成变量名几乎总是一种糟糕的方法。使用字典!在</p>
<pre><code>bonedict = {'boneList_head': ['def_neck', 'def_armbase']}
itemType='head'
def selectBones(itemType):
bones = bonedict['boneList_' + itemType]
for bone in bones:
cmds.select(bone, tgl=True)
</code></pre>
<p>请忽略我以前的回答(在我的编辑历史中可见),这是愚蠢的愚蠢,甚至。但我把它的愚蠢归咎于动态变量名的生成!在</p>
<p>让我详细说明为什么动态变量名生成是个坏主意。在</p>
<ol>
<li><p>因为动态变量生成会屏蔽变量名定义。很难区分什么已经定义,什么没有定义,所以很容易意外地重新定义一个变量。这是潜在错误的主要来源。</p></li>
<li><p>因为动态变量操作将状态更改隐藏在另一层混淆之下。在某种程度上,这是真的任何时候你创建一个字典或一个列表。但有人认为列表和字典需要一些额外的思考。另一方面,变量名应该非常简单。当变量定义和重新定义需要深思熟虑才能理解时,有些事情是错误的。</p></li>
<li><p>因为动态变量生成会污染命名空间。如果有太多的变量需要自动生成它们,那么它们应该存在于它们自己的名称空间中,而不是函数的局部空间中,<em>绝对不是全局名称空间中。linustorvalds在他的linux内核风格指南中建议,如果一个函数有5-10个以上的局部变量,<a href="https://computing.llnl.gov/linux/slurm/coding_style.pdf" rel="nofollow noreferrer">you're doing something wrong</a>。</p></li>
<li><p>因为动态变量生成有助于<a href="http://en.wikipedia.org/wiki/Coupling_(computer_programming)" rel="nofollow noreferrer">high coupling</a>,这是一件坏事。如果你给字典赋值,你可以来回地传递字典,直到牛回家为止,所有人只需要知道那本字典。如果您在一个模块的全局命名空间中动态创建变量名,那么如果另一个模块想要访问这些变量名,它必须知道它们的生成方式、该模块中定义了哪些其他变量,等等。此外,传递变量变得更加复杂,您必须传递对模块本身的引用,可能使用<code>sys.modules</code>或其他可疑结构。</p></li>
<li><p>因为动态变量生成很难看。<code>eval</code>看起来整洁干净,但实际上不是。它可以做任何事情。可以做任何事情的函数都是不好的,因为你一眼就看不出它们在做什么。一个定义良好的函数只做一件事,而且做得很好;这样,每当你看到这个函数时,你就知道发生了什么。当你看到<code>eval</code>时,实际上任何事情都可能发生。在这个意义上,<code>eval</code>就像<code>goto</code>。带有<code>goto</code>的<a href="https://stackoverflow.com/questions/46586/goto-still-considered-harmful">problem</a>并不是说你不能正确地使用它;而是说,对于<code>goto</code>的每一种可能的正确使用,都有5亿种可怕的错误使用方法。我甚至不会在这里讨论安全问题,因为归根结底,<code>eval</code>并不是真正的问题。</p></li>
</ol>