除了一本书,我还提供了一个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的答案中有一些关于这些东西的有趣细节。