这些Python符号是什么:`[[]]*n`和`(i,)`

2024-05-23 19:46:36 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能用Python解释一下这两个符号:

  • [ [] ] * n:显然这会创建对同一对象的n个引用(在本例中,是一个空列表)。在什么情况下这有用?在
  • (i,):我见过一些人使用这种“尾随逗号”表示法(例如,sets函数定义中的Generating all size k subsets of {0, 1, 2, ... n-1})。这是什么意思?在

Tags: of对象函数列表size定义sets符号
3条回答

[[]]*n创建对同一可变列表的引用。很多时候这并不是必需的,相反,您需要可以单独修改的唯一列表对象。为此,您可以使用以下方法:

list_of_list=[]对于x范围内的i(n)]

是的,这确实会创建对同一对象的引用:

>>> L = [[]] * 3
>>> L
[[], [], []]
>>> L[0].append(1)
>>> L
[[1], [1], [1]]
>>> map(id, L)
[4299803320, 4299803320, 4299803320]

当您想创建具有相同项的对象时,这可能很有用。在


(i,)使用项i创建一个元组:

^{pr2}$

需要逗号的原因是,否则它将被视为整数:

>>> mytuple = (5)
>>> print mytuple
5
>>> print type(mytuple)
<type 'int'>

[ [] ] * n创建对同一空列表对象的n引用。这几乎总是一个bug,因为通常情况下,您将对其中一个n列表使用破坏性操作,然后当它应用于外部列表的“所有”元素时会感到惊讶。在

但是,{cd4{cd2}对相同对象的引用。像这样的表达式对于初始化计数器列表非常方便(您可能会接着替换列表中的各个插槽)。因为整数是不可变的,所以不存在意外改变“所有”0的危险。对于任何其他“一路不变”类型(不一定是元组,因为尽管元组本身是不可变的,但它可以包含可变值)。在

所以这个“列表乘法”操作不是没用的。但我建议避免使用它,除非对于复制一个保证不变值列表的特定情况。虽然将可变值的列表相乘可以安全地使用,但它非常脆弱,而且常常是bug的根本原因,即使这是您要做的,您最好用稍微详细的方式来做,这样可以明显地表明您确实是认真的。在


至于(i,),Python允许在list、dictionary、tuple和set文本中使用“额外”逗号。例如,以下都是有效的:

(1, 2, 3,)
[1, 2, 3,]
{1: 'one', 2: 'two', 3: 'three',}
{1, 2, 3,}

如果省略了后面的逗号,这并没有做任何不同的事情,它只是允许作为可选的额外的。在

返回(i,)。这只是一个项目的元组,后面有逗号。但是有一个问题:对于只有一个项的元组的特殊情况,尾随的逗号不是可选的额外项,它是强制的。这是因为“一元组”将被写成(i),但是这种语法形式已经被用于使用括号来分组子表达式(例如,您无法确定(1 + 1) * 2是应该生成4还是{})。在


顺便说一句,当您将一个长元组/列表/字典/集合拆分为多行时,您可能希望使用可选尾随逗号的原因更为明显:

^{pr2}$

以这种方式编写可以让我通过重新排序源代码行来重新排序列表;如果我重新排序的项目之一是列表中的最后一个项目,我就不必再去清理逗号。在

类似地,如果我使用版本控制,在最后一个项目之后添加更多的项目并不会改变之前最后一个项目的行,因此diff是一个纯粹的添加。如果最后一行没有逗号,则需要添加一个逗号来添加更多项,这会使更改记录为该行的编辑,这会使合并冲突(稍微)更可能发生,历史日志(稍微)更难读取。在

相关问题 更多 >