在 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语言中,列表中能否包含元组,为啥?元组中能否包含列表,为啥? 谢谢大神