擅长:python、mysql、java
<p>我想您理解为什么在您的第二个示例中,第三个参数会引发错误—这是因为<code>blocks[0]</code>不是一个列表,所以您不能索引到它。我还认为您希望不会出现错误,因为只有当<code>blocks[0]</code>没有属性<code>'block_name'</code>(因为<code>getattr()</code>的第三个参数是默认值)时,才应该计算第三个参数。你知道吗</p>
<p>不幸的是,它不是这样工作的。您给出的第三个参数<code>getattr()</code>(即<code>blocks[block_num][0]</code>)是在调用函数时计算的,而不是在执行函数时计算的。你知道吗</p>
<p>不过,有一个解决方法:三元运算符可以做与<code>getattr()</code>相同的事情(如果存在,则返回一个属性,如果不存在,则返回一个默认值),但是<em>在执行时而不是在调用时计算其他参数:</p>
<pre><code>name = blocks[block_num].block_name if hasattr(blocks[block_num], 'block_name') else blocks[block_num][0].block_name
</code></pre>
<p>在对<code>getattr()</code>的调用中,在执行函数之前,这三个参数将同时求值。在我给出的这个表达式中,它们的求值顺序如下:</p>
<ol>
<li><code>if hasattr(blocks[block_num], 'block_name')</code></li>
<li><code>blocks[block_num].block_name</code>(如果1为真)</li>
<li><code>blocks[block_num][0].block_name</code>(如果1为假)</li>
</ol>
<p>这应该能解决你的问题。你知道吗</p>