2

许多 Python 的列表方法在原地运行并返回None(在我的脑海中,, insert, sort, reverse)。

但是,有一种行为经常让我感到沮丧。如果我创建一个通常返回一个对象的新列表,并同时在其上插入,则新列表“消失”:

mytup = (0, 1, 2, 3, 4)
print mytup  # (0, 1, 2, 3, 4)
mylist = list(mytup)
print mylist  # [0, 1, 2, 3, 4]
newlist = list(mytup).insert(0, 10)
print newlist  # None

所以如果我想修改一个元组,它需要更多的行:

newlist = list(mytup)
newlist.insert(0, 10)
print newlist  # [10, 0, 1, 2, 3, 4]

所以我有两个问题:

  1. 是否正确地说,当我调用列表构造函数时,它会返回对象,但是当我调用带有方法的列表构造函数时,该方法会“覆盖”返回值None?再一次,清单去哪儿了
  2. 有没有办法插入一个元组并在一行中返回一个列表?我不是想打代码高尔夫,我只是认为这两条线在逻辑上没有足够的差异,值得分开。
4

2 回答 2

3

insert,sortreverse就地修改列表并返回None. 在您的代码中,您实际上是将该返回值存储在newlist变量中。

newlist = list(mytup).insert(0, 10)

并且新创建的列表(动态创建)被垃圾收集,因为不再有对它的引用。

In [151]: mytup = (0, 1, 2, 3, 4)

In [152]: lis=list(mytup)   #create a new list object and add a reference to this new object

In [153]: newlist=lis.insert(0,10)  #perform the insert operation on lis and store None
                                    # in newlist 

In [154]: print newlist     
None

In [155]: print lis     
[10, 0, 1, 2, 3, 4]  #you can still access this list object with 
                     #the help of `lis` variable.
于 2013-04-20T14:43:43.180 回答
1

您的第一个问题的答案已经给出;您将最后一次函数调用的结果分配给变量,即None. 这是你第二个问题的答案。

而不是使用插入,做这样的事情:

newlist = [10] + list(mytup)

它创建一个list包含要插入的元素的新元素,将其附加到转换后的元素tuple并存储(引用)结果list

当然,这仅在您想在任一端插入时才有效。

如果您需要将新元素插入到其他地方,则必须对 进行切片tuple,例如在 中的第三个元素之后插入tuple

newlist = list(mytup[:3]) + [10] + list(mytup[3:])
于 2013-04-20T15:40:49.813 回答