这是我的第一个代码片段。运行时,它不会抛出断言错误。
import numpy as np
this_arr = np.ones(10)
next_arr = this_arr
next_arr *= 2
assert np.array_equal(this_arr, next_arr)
这是我的第二个代码片段。运行时,它会抛出一个断言错误。
import numpy as np
this_arr = np.ones(10)
next_arr = this_arr
next_arr = next_arr * 2
assert np.array_equal(this_arr, next_arr)
这种行为让我感到困惑。
我对第一个代码片段的理解是,我将名称初始化this_arr为指向某个内存位置的值。然后,当我初始化名称next_arr以指向相同内存位置的相同值时。因此,当我改变指向的值时next_arr,指向的值this_arr也应该改变。这种行为是 Ned Batchelder在此处创造的“Mutable-Presto-Chango” 。
但是,第二个代码片段不会以这种方式运行。起初,我认为也许*=运算符在操作符更改时不会以某种方式更改值在内存中的位置*。但是后来我回过头来看第一个片段,发现 和 的内存位置在this_arr这里next_arr也不同!鉴于此,程序如何“知道”更改值this_arr以匹配已更改的值next_arr?另外,为什么程序“不知道”更改第二个代码片段中的值?
编辑:作为后续问题:所以即使 next_arr 和 this_arr 有不同的内存位置,python 初始化的两者之间有一些潜在的联系?
跃然一笑
哔哔one
相关分类