<p><code>[ [] ] * n</code>创建对同一空列表对象的<code>n</code>引用。这几乎总是一个bug,因为通常情况下,您将对其中一个<code>n</code>列表使用破坏性操作,然后当它应用于外部列表的“所有”元素时会感到惊讶。在</p>
<p>但是,{cd4{cd2}对相同对象的引用。像这样的表达式对于初始化计数器列表非常方便(您可能会接着替换列表中的各个插槽)。因为整数是不可变的,所以不存在意外改变“所有”0的危险。对于任何其他“一路不变”类型(不一定是元组,因为尽管元组本身是不可变的,但它可以包含<em>可变值)。在</p>
<p>所以这个“列表乘法”操作不是没用的。但我建议避免使用它,除非对于复制一个保证不变值列表的特定情况。虽然将可变值的列表相乘可以安全地使用,但它非常脆弱,而且常常是bug的根本原因,即使这是您要做的,您最好用稍微详细的方式来做,这样可以明显地表明您确实是认真的。在</p>
<hr/>
<p>至于<code>(i,)</code>,Python允许在list、dictionary、tuple和set文本中使用“额外”逗号。例如,以下都是有效的:</p>
<pre><code>(1, 2, 3,)
[1, 2, 3,]
{1: 'one', 2: 'two', 3: 'three',}
{1, 2, 3,}
</code></pre>
<p>如果省略了后面的逗号,这并没有做任何不同的事情,它只是允许作为可选的额外的。在</p>
<p>返回<code>(i,)</code>。这只是一个项目的元组,后面有逗号。但是有一个问题:对于只有一个项的元组的特殊情况,尾随的逗号不是可选的额外项,它是<em>强制的</em>。这是因为“一元组”将被写成<code>(i)</code>,但是这种语法形式已经被用于使用括号来分组子表达式(例如,您无法确定<code>(1 + 1) * 2</code>是应该生成<code>4</code>还是{<cd11>})。在</p>
<hr/>
<p>顺便说一句,当您将一个长元组/列表/字典/集合拆分为多行时,您可能希望使用可选尾随逗号的原因更为明显:</p>
^{pr2}$
<p>以这种方式编写可以让我通过重新排序源代码行来重新排序列表;如果我重新排序的项目之一是列表中的最后一个项目,我就不必再去清理逗号。在</p>
<p>类似地,如果我使用版本控制,在最后一个项目之后添加更多的项目并不会改变之前最后一个项目的行,因此diff是一个纯粹的添加。如果最后一行没有逗号,则需要添加一个逗号来添加更多项,这会使更改记录为该行的编辑,这会使合并冲突(稍微)更可能发生,历史日志(稍微)更难读取。在</p>