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

In python why is a list not the same as list[:]?

本问题已经有最佳答案,请猛点这里访问。

我有一个列表,ls = [0 1 2 3 4],我运行以下内容:

1
print(ls is ls[:])

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


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

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


这基本上是

python中的字符串比较:is与==

你只是不知道而已。

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

==问这两件事是否价值相同?

is问这两件事是同一件事,即同一个对象吗?

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

因此

1
2
3
4
5
a == a[:]
>> True

a is a[:]
>> False


[:]表示一个列表的切片(从开始到结束切片),它创建一个不可见对象的浅拷贝。进一步证明:当您创建一个列表a = [1]b = a时,这里只需将a的名称重新分配给b,其中a和b都指向相同的内存地址。

1
2
3
4
5
6
7
8
9
>>> a = [1,2]
>>> b = a
>>> id(a)
140177107790232
>>> id(b)
140177107790232
>>> b.remove(1)
>>> a
[2]

但是如果你用切片的方法来做的话:

1
2
3
4
5
6
7
8
9
10
>>> a = [1,2]
>>> b = a[:]
>>> id(a)
140177107873232
>>> id(b)
140177107873304
>>> b.remove(1)
>>> a
[1, 2]
>>>

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

例子:

1
2
3
4
5
6
7
8
9
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的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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]