在python中为什么列表与list [:]不同?

时间:2017-10-17 13:41:44

标签: python list

我有一个列表ls = [0 1 2 3 4],我正在执行以下操作:

print(ls is ls[:])

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

4 个答案:

答案 0 :(得分:6)

ls引用内存中的一个对象; ls[:]使用第一个中包含的相同引用创建 new 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 :(得分:2)

这基本上是

的副本

String comparison in Python: is vs. ==

你只是不知道。

==is检查两件不同的事情。

==要求这两个值相同。

is要求这两件事情是同一件事,即同一个对象。

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

因此

a == a[:]
>> True

a is a[:]
>> False

答案 2 :(得分:1)

[:]创建ls的浅表副本,该副本会破坏新列表对ls的原始引用。但请记住,嵌套列表不受[:]影响,因此需要copy.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]

deepcopy的用法:

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]

答案 3 :(得分:1)

FEATURE_A FEATURE_B FEATURE_C FEATURE_D ID 1 1 1 1 0 2 1 0 1 0 3 0 1 0 1 表示切片列表(从开始到结束的切片),它创建了可迭代对象的浅表副本。 进一步证明: 当您创建列表[:]并执行a = [1]时,您只需将a的名称重新分配给b,其中a和b都指向相同的内存地址

b = a

但如果你用切片做到这一点:

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