使用带受让人的切片表示法为列表赋值

Assign value to a list using slice notation with assignee

我看到有人使用 [:] 来复制列表,例如:

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

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

更多的是关于它如何复制列表。示例:

>>> 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。希望这有助于解决问题。

是的,当您在左侧使用 [:] 时,它会就地更改(变异)列表,而不是将新列表分配给名称(变量)。要看到这一点,请尝试以下代码 -

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]

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

当你写 a[:] = b a 是一个用 b 的元素初始化的列表:b 的改变不会影响 a


而且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,则它不受影响

使用 a[:] = b,您更改 a 的元素。如果另一个变量指向 a 它也会被改变。