gpt4 book ai didi

python - 为什么 Python 3 中的切片仍然是副本而不是 View ?

转载 作者:IT老高 更新时间:2023-10-28 20:33:28 24 4
gpt4 key购买 nike

正如我在评论 this answer 后才注意到的那样,Python 3 中的切片返回它们切片而不是 View 的浅拷贝。为什么还是这样?即使撇开 numpy 使用 View 而不是副本进行切片,dict.keysdict.valuesdict.items 在 Python 3 中都返回 View ,并且 Python 3 的许多其他方面都旨在更多地使用迭代器,这使得它看起来切片会变得相似。 itertools 确实有一个 islice 函数可以进行迭代切片,但这比普通切片更受限制,并且不提供 dict.keysdict.values 的 View 功能。

同样,您可以使用对切片的赋值来修改原始列表,但切片本身是副本而不是 View ,这是该语言的一个矛盾方面,并且似乎违反了 the Zen of Python 中说明的几个原则。

也就是说,你可以做到的事实

>>> a = [1, 2, 3, 4, 5]
>>> a[::2] = [0, 0, 0]
>>> a
[0, 2, 0, 4, 0]

但不是

>>> a = [1, 2, 3, 4, 5]
>>> a[::2][0] = 0
>>> a
[0, 2, 3, 4, 5]

或类似的东西

>>> a = [1, 2, 3, 4, 5]
>>> b = a[::2]
>>> b
view(a[::2] -> [1, 3, 5]) # numpy doesn't explicitly state that its slices are views, but it would probably be a good idea to do it in some way for regular Python
>>> b[0] = 0
>>> b
view(a[::2] -> [0, 3, 5])
>>> a
[0, 2, 3, 4, 5]

似乎有些武断/不受欢迎。

我知道 http://www.python.org/dev/peps/pep-3099/ 以及它说“切片和扩展切片不会消失(即使 __getslice____setslice__ API 可能被替换)的部分,它们也不会返回标准对象类型的 View 。”,但是链接的讨论没有提到为什么做出关于切片 View 的决定;事实上,在原始帖子中列出的建议中,大多数关于该具体建议的评论似乎都是积极的。

是什么阻止了这样的事情在 Python 3.0 中实现,Python 3.0 专门设计为不严格向后兼容 Python 2.x,因此将是实现这种设计更改的最佳时机,是否存在在未来的 Python 版本中有什么可能阻止它吗?

最佳答案

As well, the fact that you can use assignment to slices to modify the original list, but slices are themselves copies and not views.

嗯.. 这不太对;虽然我能看出你会怎么想。在其他语言中,切片分配,例如:

a[b:c] = d

等价于

tmp = a.operator[](slice(b, c)) # which returns some sort of reference
tmp.operator=(d) # which has a special meaning for the reference type.

但在python中,第一条语句实际上是转换成这样的:

a.__setitem__(slice(b, c), d)

也就是说一个item assignment实际上在python中被特意识别为具有特殊含义,与item lookup和assignment分开;它们可能无关。这与python整体上是一致的,因为python没有像C/C++中的"lvalues"这样的概念;没有办法重载赋值运算符本身;仅当分配的左侧不是普通标识符时的特定情况。

假设列表有 View ;而你尝试使用它:

myView = myList[1:10]
yourList = [1, 2, 3, 4]
myView = yourList

在除 python 之外的语言中,可能有一种方法可以将 yourList 插入 myList,但在 python 中,因为名称 myView 显示为一个裸标识符,它只能表示一个变量赋值; View 丢失。

关于python - 为什么 Python 3 中的切片仍然是副本而不是 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com