使用带有受让人的切片表示法将值分配给列表

时间:2015-08-21 12:36:06

标签: python list slice

我见过有人使用[:]制作列表的燕子副本,例如:

>>> 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]

但我真的不明白为什么他们在这里使用[:]。我不知道有什么不同吗?

3 个答案:

答案 0 :(得分:7)

a[:] = ba = 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[:] = ba = 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。希望有助于澄清事情。