提问人:push.up.hoyv 提问时间:8/22/2023 最后编辑:Gino Mempinpush.up.hoyv 更新时间:8/22/2023 访问量:50
在列表切片上应用列表方法和重新分配有什么区别?
What are the differences between applying list methods and reassignment on a list slice?
问:
当我学习列表方法时,我在列表切片上尝试了这些代码:a[:]
a = list('zyx')
a[:].pop()
print(a)
a = list('zyx')
a[:].append('o')
print(a)
a = list('zyx')
a[:].clear()
print(a)
a = list('zyx')
a[:] = []
print(a)
我得到的结果是:
['z', 'y', 'x']
['z', 'y', 'x']
['z', 'y', 'x']
[]
让我感到困惑的是列表方法和重新赋值都改变了列表切片,但为什么重赋会影响原始列表,而列表方法却没有?
我知道这可能是关于浅拷贝的,但我无法确切地说出原因。
答:
2赞
Bharel
8/22/2023
#1
了解下面的方法可能是成功的关键:
表达式中使用的切片调用切片的开始和结束位置。a[:]
list.__getitem__(slice(None, None))
None, None
调用具有切片的列表将返回由该切片组成的新列表对象(浅拷贝)。这意味着将对已创建的临时新列表进行操作。__getitem__
a[:].anything()
等于 () 左侧的切片调用 。换句话说,它修改了现有列表 - 这是您通常期望的。a[:] = value
list.__setitem__(slice(None, None), value)
正如@jasonharper所指出的,在没有其他引用的情况下修改新的临时切片会令人困惑,而且不是很有用;这是不对称的另一个原因。
评论
1赞
push.up.hoyv
8/22/2023
谢谢,你的回答现在更清楚了。我需要更多时间来理解您提到的功能。感谢您的快速回复。
评论