<p>您的第一个case在<code>block_num = 2</code>,<code>blocks[2][0]</code>是<code><__main__.Block at 0x....></code>时起作用,因为<code>blocks[2]</code>是一个列表</p>
<p>在第一种情况下,您有<code>getattr(blocks[block_num], 'block_name', blocks[block_num][0].block_name)</code>表示<code>block_num = 2</code>,<code>blocks[block_num]</code>是一个列表,并且该列表不包含<code>block_name</code>,因此返回默认值<code>blocks[block_num][0].block_name</code></p>
<p>在第二种情况下,对于<code>block_num=0</code>,在调用函数时会计算默认值,但最终会抛出<code>TypeError: 'Block' object is not subscriptable</code>,因为<code>blocks[0]</code>是一个对象<code><__main__.Block at 0x....></code>,并且不能索引对象</p>
<p>为了保持一致,一个建议可能是改为<code>blocks_list[block_num].block_name</code></p>
<p>更新后的代码可能看起来像</p>
<pre><code>class Block(object):
def __init__(self, name):
self.block_name = name
blocks_list = [Block("d"), Block("d"), Block("d")]
blocks = [Block("a"), Block("b"), blocks_list, Block("c")]
block_num = 2
name = getattr(blocks[block_num], 'block_name', blocks_list[block_num].block_name)
print(name)
block_num = 0
name = getattr(blocks[block_num], 'block_name', blocks_list[block_num].block_name)
print(name)
</code></pre>
<p>这给了你</p>
<pre><code>d
a
</code></pre>