除了一本书,我还提供了一个Python程序,我正在深入挖掘它。
程序使用名为globdat的全局数据结构,在特定的例程中,globdat中的numpy数组被分配给一个局部变量:

a = globdat.array

然后在接下来的while循环中,变量a将根据以下内容每次迭代更新:
a[:] += da[:]

此操作的结果是更新globdat.array,用于后续操作。
这里是否需要使用[:],或者仅仅用于指示它也克隆到globdat.array?有人能解释一下这种编码方式吗?

最佳答案

右侧的第二个[:],是多余的。它只是在连接之前复制da,这是毫无意义的。
我们只剩下:

a[:] += da

首先,让我们了解a += da的作用。它映射到:
a = a.__iadd__(da)

__iadd__的调用扩展了原始列表a,并返回self,即对该列表的引用。之后发生的任务在这种情况下没有效果(与a=a相同)。
这实现了最初的目标,即扩展全局阵列。
现在,a[:] += da做什么?它映射到:
a[:] = a[:].__iadd__(da)

或者更乏味的是:
a.__setitem__(slice(None), a.__getitem__(slice(None)).__iadd__(da))

为了可读性,让我们把它写成(不是一个有效的Python语法):
a.__setitem__(:, a.__getitem__(:).__iadd__(da))

所以a[:].__iadd__(da)
创建a的副本(调用为a2
da连接到a2位置
返回a2
然后作业:
a[:] = ...中的所有值替换为a中的所有值。
所以,也达到了最初的目的,但Wayyyyyy效率较低。
this question的答案中有一些关于这些东西的有趣细节。

07-25 21:21