在Python中为切片的元素赋值

dln*_*385 7 python list variable-assignment slice

这是一个关于Python如何处理数据和变量的简单问题.我已经做了很多实验,并且Python大部分已经弄清楚了,除了这让我一直绊倒:

[编辑:为了清晰起见,我将这些例子分开并重新排列]

例1:

>>> a = [[1], 2]
>>> a[0:1]
[[1]]
>>> a[0:1] = [[5]]
>>> a
[[5], 2] # The assignment worked.
Run Code Online (Sandbox Code Playgroud)

例2:

>>> a = [[1], 2]
>>> a[0:1][0]
[1]
>>> a[0:1][0] = [5]
>>> a
[[1], 2] # No change?
Run Code Online (Sandbox Code Playgroud)

例3:

>>> a = [[1], 2]
>>> a[0:1][0][0]
1
>>> a[0:1][0][0] = 5
>>> a
[[5], 2] # Why now?
Run Code Online (Sandbox Code Playgroud)

谁能向我解释这里发生了什么?

到目前为止,答案似乎声称a[0:1]返回一个新列表,其中包含对第一个元素的引用a.但我不明白这是如何解释实例1的.

kob*_*las 7

a [0:1]返回一个新数组,其中包含对数组[1]的引用,因此最终通过引用调用修改内部数组.

第一种情况不修改[1]数组的原因是您为复制的外部数组分配了一个新的内部数组值.

底线 - [0:1]返回数据的副本,但不复制内部数据.

  • 是的,当赋值状态(即"="信号)出现在切片引用之后时,它与完成其他操作时完全不同.要清楚:`>>> a [0:1] = [[5]]`相当于`a .__ setitem __(slice(0,1,None),[5])`---而``a [ 0:1] [0] = 5`与:a .__ getitem __(slice(0,1,None)).__ setitem __(0,5)相同 (4认同)