我见过有人使用[:]
制作列表的燕子副本,例如:
>>> a = [1,2,3,4]
>>> b = a[:]
>>> a[0] = 5
>>> print a
[5, 2, 3, 4]
>>> print b
[1, 2, 3, 4]
我理解。但是,我在分配到列表时也看到过使用这种表示法的人,比如:
>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> a[:] = b
>>> print a
[4, 5, 6, 7]
>>> print b
[4, 5, 6, 7]
但我真的不明白为什么他们在这里使用[:]
。我不知道有什么不同吗?
答案 0 :(得分:7)
a[:] = b
和a = b
确实存在差异。
>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> c = [8,9,0,1]
>>> c = b
>>> a[:] = b
>>> b[0] = 0
>>> a
[4, 5, 6, 7]
>>> c
[0, 5, 6, 7]
>>>
当你写a = b
时,a是对b的相同列表的引用:b中的任何更改都会影响
当您编写a[:] = b
时,a是使用b元素初始化的列表:b中的更改不会影响
a[:] = b
和a = b[:]
之间也存在差异。
>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> c = a
>>> a = b[:]
>>> a
[4, 5, 6, 7]
>>> c
[1, 2, 3, 4]
>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> c = a
>>> a[:] = b
>>> a
[4, 5, 6, 7]
>>> c
[4, 5, 6, 7]
使用a = b[:]
,如果另一个指向它的变量不受影响,则使用b中的元素创建一个新列表
使用a[:] = b
,您可以更改a的元素。如果指向它的另一个变量也被更改。
答案 1 :(得分:4)
是的,当您在左侧使用[:]
时,它会更改(变更)列表,而不是为名称(变量)分配新列表。要查看,请尝试以下代码 -
a = [1,2,3,4]
b = a
a[:] = [5,4,3,2]
print(a)
print(b)
您会看到'a'和'b'都已更改。
要查看上述和正常分配之间的区别,请尝试以下代码 -
a = [1,2,3,4]
b = a
a = [5,4,3,2]
print(a)
print(b)
您会看到只有'a'发生了变化,'b'仍然指向[1,2,3,4]
答案 2 :(得分:2)
它更多地是关于它如何复制列表而不是任何东西。例如:
>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6, 7]
>>> a = b
>>> b[0] = 9
>>> a
[9, 5, 6, 7]
>>> b
[9, 5, 6, 7]
此处a
现在引用b
,因此更改b
的值也会影响a
。
>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6, 7]
>>> a[:] = b
>>> b[0] = 9
>>> a
[4, 5, 6, 7]
>>> b
[9, 5, 6, 7]
在使用切片的情况下,它只是列表元素的浅表副本,因此b
中的更改不会影响a
。希望有助于澄清事情。