今天我使用numpy数组进行一些计算,发现一个奇怪的问题,例如,假设我已经在Ipython中导入了numpy.arange,并且我运行了一些脚本,如下所示:
In [5]: foo = arange(10)
In [8]: foo1 = foo[arange(3)]
In [11]: foo1[:] = 0
In [12]: foo
Out[12]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [16]: foo2 = foo[0:3]
In [19]: foo2[:]=0
In [21]: foo
Out[21]: array([0, 0, 0, 3, 4, 5, 6, 7, 8, 9])
上面显示,当我按 foo[arange(3)] 切片数组时,我得到了数组切片的副本,但是当我按 foo[0:3] 切片数组时,我得到了数组切片的引用,因此foo 随 foo2 改变。然后我认为 foo 和 foo2 应该有相同的 id,但这似乎不是真的
In [59]: id(foo)
Out[59]: 27502608
In [60]: id(foo2)
Out[60]: 28866880
In [61]: id(foo[0])
Out[61]: 38796768
In [62]: id(foo2[0])
Out[62]: 38813248
...
更奇怪的是,如果我不断检查 foo 和 foo2 的 id,它们不是恒定的,有时,它们确实相互匹配!
In [65]: id(foo2[0])
Out[65]: 38928592
In [66]: id(foo[0])
Out[66]: 37111504
In [67]: id(foo[0])
Out[67]: 38928592
谁能解释一下吗?我对python的这个动态特性真的很困惑
多谢