Я недавно запустил это в блокноте jupyter (ячейке), потому что я хотел проверить поведение адреса памяти в массивном массиве при нарезке.Однако нарезка не приведена, чтобы создать минимальный неудачный пример.
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
)?
ОБНОВЛЕНИЕ, в отношении комментария jdehesa
Это также происходит в «сыром» питоне 3.6, так что это не связано с IPython или Jupyter.
Удивительно, ноэто происходит только при использовании one print-Statement для трех значений.
$ 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>