2017-10-17 30 views
1

我有一个列表,ls = [0 1 2 3 4]和我运行的是以下几点:在Python中,为什么列表与列表[:]不一样?

print(ls is ls[:]) 

我得到的输出作为False。他们为什么不是同一个名单?当我打印两个版本时,我都会打印相同的列表。

+3

'ls [:]'是ls'的完整副本,所以它们不是同一个对象。但他们是平等的:'ls == ls [:]' – alexis

+1

切片创建副本 –

+0

为什么列表副本必须具有相同的ID?然后,他们会参考相同的列表... –

回答

1

[:]创建一个ls的浅拷贝,它破坏了新列表的原始引用ls。但请记住,嵌套列表不受[:]影响,因此需要copy.deepcopy

实施例:

用法 deepcopy
s = [5, 6, 2, 4] 
=>s 
[5, 6, 2, 4] 
new_s = s 
new_s.append(100) 
=>new_s 
[5, 6, 2, 4, 100] 
=>s 
[5, 6, 2, 4, 100] 

:在存储器

s = [5, 6, [5, 6, 2, 4], 4] 
new_s = s[:] 
new_s[2].append(45) 
=>s 
[5, 6, [5, 6, 2, 4, 45], 4] #both sublists are still being referenced 
=>new_s 
[5, 6, [5, 6, 2, 4, 45], 4] 
import copy 
s1 = [5, 6, [5, 6, 2, 4], 4] 
new_s1 = copy.deepcopy(s1) 
new_s1[2].append(100) 
=>new_s1 
[5, 6, [5, 6, 2, 4, 100], 4] 
=>s1 
[5, 6, [5, 6, 2, 4], 4] 
+0

得到你的答案我不认为这个例子是最清晰的,使用可变类型的方法。 – Adirio

6

ls引用一个对象; ls[:]创建一个新的list对象使用与第一个中包含的相同的参考。

>>> ls = [0, 1, 2, 3, 4] 
>>> new_ls = ls[:] 
>>> id(ls) == id(new_ls) 
False 
>>> id(ls[0]) == id(new_ls[0]) 
True 
+1

请注意'id(ls [0])== id(0)'。在某些Python实现中,低数字是单例,以提高速度和内存使用率。 – Adirio

+0

我不认为这会让你分心太多,但你可以在不改变结果的情况下替换'ls = [object(),object(),object(),object(),object()]' 。如果您期待'[0,0,0,0,0]'是5个不同引用的列表,那将会是一个更大的问题。 – chepner

+0

对,只是指出来。 – Adirio

2

这是基本的

String comparison in Python: is vs. ==

重复你只是不知道它。

==is检查两个不同的东西。

==问是这两个东西同样的价值。

is问这两件事是同一件事,即同一件事。

a[:]复制列表创建具有相同值的新列表。

从而

a == a[:] 
>> True 

a is a[:] 
>> False 
1

[:]表示列表的切片(从开始到结束快讯)它能创建我们的迭代对象的浅表副本。 为了进一步证明: 当你创建一个列表a = [1]b = a,一个在这里你只是重新分配名字B,其中A和B点o相同的内存地址

>>> a = [1,2] 
>>> b = a 
>>> id(a) 
140177107790232 
>>> id(b) 
140177107790232 
>>> b.remove(1) 
>>> a 
[2] 

但是如果你切片做:

>>> a = [1,2] 
>>> b = a[:] 
>>> id(a) 
140177107873232 
>>> id(b) 
140177107873304 
>>> b.remove(1) 
>>> a 
[1, 2] 
>>> 
相关问题