Не путайте указатели с ссылками.Они не одно и то же.Указатель - это просто адрес объекта.На самом деле у вас нет доступа к адресу объекта в python, только ссылки на них.
Когда вы присваиваете объект переменной, вы присваиваете ссылку на некоторый объект переменной.
x = 0
# x is a reference to an object `0`
y = [0]
# y is a reference to an object `[0]`
Некоторые объекты в Python являются изменяемыми, то есть вы можете изменить свойства объекта.Другие являются неизменяемыми, то есть вы не можете изменять свойства объекта.
int
(скалярный объект) является неизменным.Нет свойства int
, которое вы могли бы изменить (он же мутировал).
# suppose ints had a `value` property which stores the value
x.value = 20 # does not work
list
(нескалярный объект), с другой стороны, является изменчивым.Вы можете изменить отдельные элементы списка, чтобы они ссылались на что-то еще.
y[0] = 20 # changes the 0th element of the list to `20`
В приведенных вами примерах:
>>> x = [0]
>>> y = [x]
вы не имеете дело с указателями, вы 'имеем дело со ссылками на списки с определенными значениями.x
- список, содержащий одно целое число 0
.y
- это список, который содержит ссылку на то, на что ссылается x
(в данном случае это список [0]
).
Вы можете изменить содержимое из x
вот так:
>>> print(x)
[0]
>>> x[0] = 2
>>> print(x)
[2]
Вы можете изменить содержимое списка, на который ссылается x
через y
ссылку:
>>> print(x)
[2]
>>> print(y)
[[2]]
>>> y[0][0] = 5
>>> print(x)
[5]
>>> print(y)
[[5]]
Вы можетеизмените содержимое из y
для ссылки на что-то еще:
>>> print(y)
[[5]]
>>> y[0] = 12345
>>> print(x)
[5]
>>> print(y)
[12345]
Это в основном та же семантика языка, как Java или C #.Вы не используете указатели на объекты напрямую (хотя вы используете косвенно, поскольку реализации используют закулисные указатели), но ссылаются на объекты.