2013-04-20 65 views
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. 它是正确的说,当我调用列表的构造函数,它返回的对象,但是当我打电话列表构造函数的方法就可以了,该方法使用0123“覆盖”返回?再次,名单
  2. 有没有办法插入一个元组并返回一行中的列表?我不是想打代码高尔夫,我只是不认为这两条线在逻辑上是不同的,不值得分离。
+1

我认为将它们放在一行上将是一个坏主意。他们是单独的操作,为什么试图将它们塞进一行? – 2013-04-20 14:45:26

+0

在我的脑海里,我有一个序列,我想修改它。如果它是一个列表,我可以直接插入。但它恰好是我自己的错误的一个元组,所以我必须使用两行代码?它减缓了我的思维过程。我认为这是列表和元组在许多情况下具有类似行为的结果。 – Lenna 2013-04-20 14:58:35

+0

它不会“覆盖”返回值。发生什么事是,当你做'list(...)。insert(...)'你实际上在调用新创建列表的方法,你不再要求构造函数的结果。当然,这个方法返回'None'。 – ubik 2013-04-20 15:00:15

回答

1

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

而不是使用插入件,这样做:

newlist = [10] + list(mytup) 

它创建包含元素的新list被插入,其附加到转换tuple并存储(参考到)将所得list

这当然只适用于要插入任何一端的情况。

如果您需要将新元素插入其他位置,则必须切片tuple,例如,在tuple中的第三个元素后面插入:

newlist = list(mytup[:3]) + [10] + list(mytup[3:]) 
3

insertsortreverse修改就地列表,并返回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. 
+0

我知道他们返回无(编辑澄清);但在我的第三项任务中,名单消失了,而且从未被命名。我认为我在Q1中所描述的理解是正确的。 – Lenna 2013-04-20 14:56:12

+0

@Lenna在newlist = list(mytup).insert(0,10)的情况下,python首先创建列表list(mytup),然后执行insert操作,然后在'newlist '。但是现在没有一个变量指向新创建的列表,因此python的垃圾收集器将其从内存中移除。 – 2013-04-20 15:00:58