我最近在jupyter笔记本(单元)中运行了此命令,因为我想在切片时验证numpy数组的内存地址行为。但是,切片被忽略了,以创建一个最小的失败示例。
import numpy as np
x = np.zeros(10)
x.data.__repr__(), x.data, x.data.__repr__()
我很惊讶最后一个值与前两个不同:
('<memory at 0x7f04073a6ac8>',
<memory at 0x7f04073a6ac8>,
'<memory at 0x7f04073a6b88>')
我在第二个元组项中添加了一个额外的空间,以便直观地对齐内存地址。
jupyter如何对x
进行更改,以将x.data.__repr__()
(0x7f04073a6ac8
)尤其是6c8
(0x7f04073a6b88
)更改为b88
? / p>
这也发生在“原始” python 3.6中,因此它与IPython或Jupyter不相关。
令人惊讶的是,这仅在将三个值使用 one 打印语句时发生。
$ cat moving_memory.py
import numpy as np
x = np.zeros(10)
print(x.data.__repr__())
print(x.data)
print(x.data.__repr__())
print(x.data.__repr__(), x.data, x.data.__repr__())
$ python3.6 moving_memory.py
<memory at 0x7f3f49b02dc8>
<memory at 0x7f3f49b02dc8>
<memory at 0x7f3f49b02dc8>
<memory at 0x7f3f49b02dc8> <memory at 0x7f3f49b02dc8> <memory at 0x7f3f49b02e88>