我有一个列表,ls = [0 1 2 3 4]
和我运行的是以下几点:在Python中,为什么列表与列表[:]不一样?
print(ls is ls[:])
我得到的输出作为False
。他们为什么不是同一个名单?当我打印两个版本时,我都会打印相同的列表。
我有一个列表,ls = [0 1 2 3 4]
和我运行的是以下几点:在Python中,为什么列表与列表[:]不一样?
print(ls is ls[:])
我得到的输出作为False
。他们为什么不是同一个名单?当我打印两个版本时,我都会打印相同的列表。
[:]
创建一个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]
得到你的答案我不认为这个例子是最清晰的,使用可变类型的方法。 – Adirio
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
这是基本的
String comparison in Python: is vs. ==
重复你只是不知道它。
==
和is
检查两个不同的东西。
==
问是这两个东西同样的价值。
is
问这两件事是同一件事,即同一件事。
a[:]
复制列表创建具有相同值的新列表。
从而
a == a[:]
>> True
a is a[:]
>> False
[:]
表示列表的切片(从开始到结束快讯)它能创建我们的迭代对象的浅表副本。 为了进一步证明: 当你创建一个列表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]
>>>
'ls [:]'是ls'的完整副本,所以它们不是同一个对象。但他们是平等的:'ls == ls [:]' – alexis
切片创建副本 –
为什么列表副本必须具有相同的ID?然后,他们会参考相同的列表... –