试图理解列表的切片

时间:2017-11-05 11:28:06

标签: python

我有一个列表,我想了解它的切片。我对它进行了切片[0:1]

>>> l=[1,2,3,4]
>>> id(l[0])
140079803522784
>>> id(l[0:1][0])
140079803522784

他们是一样的。但是:

>>> l[0]=7
>>> l
[7, 2, 3, 4]
>>> l[0:1][0]=13
>>> l
[7, 2, 3, 4]

因此切片的0元素与列表的0元素相同,但是当我在切片中更改它时,它不会在列表中更改。为什么不呢?

1 个答案:

答案 0 :(得分:0)

From the documentation

  

所有切片操作都返回包含所请求元素的新列表。这意味着以下切片返回列表的新(浅)副本。

所以基本上当你执行l[0:1][0] = 13时,你会在新列表中指定13作为值,而不是l。这和你做的一样

[l[0]] = 13

g = [l[0]]
g[0] = 13

请注意,这仅适用于不可变类型,例如intstr。由于切片执行浅拷贝,因此如果修改对象,则会获得预期的行为。

>>> l = [{'hi': 7}, {}, {}, {}]
[{'hi': 7}, {}, {}, {}]
>>> l[0:1][0]['hi'] = 1
>>> l[0]
{'hi': 1}