在 python 中,为啥列表与列表 [:] 不同? [复制]

Posted

技术标签:

【中文标题】在 python 中,为啥列表与列表 [:] 不同? [复制]【英文标题】:In python why is a list not the same as list[:]? [duplicate]在 python 中,为什么列表与列表 [:] 不同? [复制] 【发布时间】:2018-03-29 05:36:22 【问题描述】:

我有一个列表,ls = [0 1 2 3 4],我正在运行以下命令:

print(ls is ls[:])

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

【问题讨论】:

ls[:] 制作了ls 的完整副本,因此它们不是同一个对象。不过,它们是平等的:ls == ls[:] 切片创建副本 为什么列表副本必须具有相同的 id?然后他们仍然会引用同一个列表...... is 检查它们是否是同一个对象,而实际上它们不是。它们是副本。当您执行ls[:] 时,您正在制作原始ls 的副本。 @cricket_007 没有。问题的表述方式不同——仅仅因为答案相同并不意味着它是一个重复的问题。 OP 或任何普通读者同样可能理解is,但不是a[:] 是复制运算符。 【参考方案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]

【讨论】:

我不认为这个例子是最清楚的,使用可变类型方法。【参考方案2】:

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

【讨论】:

小心点,id(ls[0]) == id(0)。在某些 Python 实现中,低数字是单例,以提高速度和内存使用率。 我不认为这会分散太多注意力,但是您当然可以在不改变结果的情况下替换 ls = [object(), object(), object(), object(), object()]。如果您期望 [0, 0, 0, 0, 0] 是一个包含 5 个不同引用的列表,那将是一个更大的问题。 对,只是指出来。【参考方案3】:

这基本上是复制的

String comparison in Python: is vs. ==

你只是不知道。

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

== 询问这两个东西是否具有相同的值。

is 询问这两件事是否相同,即相同的对象。

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

因此

a == a[:]
>> True

a is a[:]
>> False

【讨论】:

【参考方案4】:

[:] 表示对列表进行切片(从头到尾切片),这会创建可迭代对象的浅表副本。 为了进一步证明: 当您创建一个列表a = [1] 并执行b = a 时,在这里您只是将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]
>>> 

【讨论】:

以上是关于在 python 中,为啥列表与列表 [:] 不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

组合列表中的元素:似乎python以两种不同的方式处理同一个项目,我不知道为啥[重复]

急求!!!在python语言中,列表中能否包含元组,为啥?元组中能否包含列表,为啥? 谢谢大神

python中为啥说元组不可改变

为啥 '.sort()' 导致列表在 Python 中为 'None'? [复制]

Python,明明只append了一次,为啥所有子列表都变了啊.jpg