2015-12-21 59 views
5

我老了,没有头发留下来拔出。我已经阅读了许多类似问题的答案,就像我可以在SO上找到的一样。我有以下代码:Python 3.5列表理解修改原始

a = [[1,2],[3,4],[4,5]] 
b = ['a','b','c'] 
print('a:',a) 
print('b:',b) 
c = a[:] 
print('c == a:', c==a) 
print('c is a:',c is a) 
print('id(c) = id(a):', id(c)==id(a)) 
[x.extend(b) for x in c] 
print('c after:',c) 
print('a after:',a)` 

输出是:

a: [[1, 2], [3, 4], [4, 5]] 
b: ['a', 'b', 'c'] 
c == a: True 
c is a: False 
id(c) = id(a): False 
c after: [[1, 2, 'a', 'b', 'c'], [3, 4, 'a', 'b', 'c'], [4, 5, 'a', 'b', 'c']] 
a after: [[1, 2, 'a', 'b', 'c'], [3, 4, 'a', 'b', 'c'], [4, 5, 'a', 'b', 'c']] 

我找显示为结果“C后:”但我不明白为什么一个被修改了,太? 我也试过

c = list(a) 

c = copy.copy(a) 

当然,正如所料简单C = A不起作用。 我错过了什么? 谢谢。

回答

7

这是因为您不复制列表中的元素。不会复制a中的列表。因此,您的extend方法会影响这两个列表中的元素。您应该使用c = copy.deepcopy(a)来复制嵌套元素。

1

尝试分配了C列表这样的,(不.copy()解决方案)

c = [] 
for elem in a: 
    c.append(list(elem)) 

或一个内胆采用列表理解

c = [list(elem) for elem in a] 

,如果您有此列表提供深拷贝名单内,当然不是3层。

你做的失败的原因是你设法正确地复制列表,但里面的列表仍然被重新归为相同的记忆值,因此在元素列表中没有拷贝。此解决方案还复制内部列表,这是深度复制的定义。

0

正如其他海报解释,A内的列表实际上并没有复制到C - 他们只是参考原始的。你可以看到,当您运行下面的代码:

num_lists = [[1,2],[3,4],[4,5]] 
lists_copy = num_lists[:] 

orig_first = num_lists[0] 
copy_first = lists_copy[0] 

print('Are the first elements the same object?', orig_first is copy_first) 

它打印“真”,意思是[1,2]内lists_copy实际上是[1,2]从NUM_LISTS。复制Python列表太复杂了,我希望他们在将来更改它更友好。截至目前,你能做的最好的是: lists_copy = copy.deepcopy(num_lists)

你可以看到它下面的工作:

from copy import deepcopy 

lists_copy = deepcopy(num_lists) 

orig_first = num_lists[0] 
copy_first = lists_copy[0] 

print('Are they they the same after copying with deepcopy?', orig_first is copy_first) 

此代码打印“假”,这意味着该列表被安全地复制和平衡,最终恢复到宇宙:)

0

也考虑到列表是可变类型,可以在创建后修改,而不可变类型例如字符串。不可变类型在创建后无法更改。因此,如果您尝试附加第二个字符串,则会创建一个字符串的实际副本。可变类型可以更改。因此,没有复制,并且a和c都引用相同的列表。