2012-01-21 114 views
0

我知道列表L可以通过执行L [:]来复制。但是我面临一个我不明白为什么的问题。Python列表副本

src = [1,2,3] 
dest = [[5,6,7]] 
dest.append(src[:].append(4)) 
dest 
[[5, 6, 7], None] 

在上述样品中,SRC列表不被复制至目的(见无)当我试图复制和追加4到它。

dest.append(src[:]) 
dest 
[[5, 6, 7], None, [1, 2, 3]] 

可以看出在上面的代码片段,如果我添加只需添加清单(DEST)没有任何附加的尝试,它就会被插入。 有什么想法?

+0

你需要什么样的最终结果? [[5,6,7],[1,2,3]]?或[5,6,7,1,2,3]? – zengr

+0

@zengr,[[5,6,7],[1,2,3,4]]。问题是'append'不返回修改后的列表(它返回None)。 –

回答

7

append试图做的是在给定列表上附加数据并返回None

这就是为什么你会在dest的末尾看到None

下面的代码应该做你想要什么:

dest.append(src + [4]) 
3

功能/修饰的参数的方法/对象就地应该返回None。这是Python中的一个常见约定。例如,.append(),.extend(),random.shuffle();一个明显的例外是.pop()

由于@qiao already said你可以使用:

dest.append(src + [4]) 

或者

dest += [src + [4]] 

src + [4]创建一个新的列表:[1,2,3,4],所以你不需要做出明确src副本。

+0

好的。现在我明白了。感谢Rob和Sebastian。 – sachin2182

+0

问题,你知道为什么存在这样的约定吗?也许这是因为我也习惯于Javascript,但是返回'self'似乎比'None'更有用。这只是BDFL的偏好吗? – voithos

+1

它旨在确保您避免意外使用变异方法而不意识到变异造成的错误。例如,如果'list#sort'返回了列表,那么你可以错误地调用'foo(my_list.sort())'(当你应该写'foo(sorted(my_list))')时,然后有问题因为'my_list'在调用之后仍然被排序(而不是让'foo'使用排序后的副本)。 –