如何在python 3中进行切片修改(或缺少操作符重载)



在numpy中,可以获取slice并对其进行修改:

a = np.array([1, 2, 3, 4, 5])
a[2:4] = [7, 8]
# now a is np.array([1, 2, 7, 8, 5])

它是如何实现的?

假设你有一些二维数组类,Array2d,它有一些复杂的二维数组实现,比如二维trie。您希望__getitem__方法返回Array2dSlice对象,该对象可以修改:

a = Array2d()
...
#     [1  2  3]
# a = [4  5  6]
#     [7  8  9]
a[1:3, 1:3] = [[0, 0], [0, 0]]
#     [1  2  3]
# a = [4  0  0]
#     [7  0  0]

如果Python中有操作符重载,我会在Array2dSlice类中使用它。但是没有操作符重载。有合适的替代品吗?

如果索引操作符[]出现在赋值操作符=的左侧,则该特殊方法称为__setitem__,而不是__getitem__

在这种情况下,有效调用是:

a.__setitem__(tuple(slice(1, 3), slice(1, 3)), [[0, 0], [0, 0]])

这在一个地方提供了有效修改数组所需的所有信息。