Указатели в Python? `x.pointerDest = y.pointerDest`? - PullRequest
3 голосов
/ 14 февраля 2011

Я разбиваю свой старый вопрос на части, потому что это очень грязный зверь здесь . Этот вопрос связан с этим ответом и этим ответом . Я пытаюсь понять указатели, даже не уверен, существуют ли они в Python.

# Won't change x with y=4
>>> x = 0; y = x; y = 4; x
0

# Won't change y
>>> x = 0; y = x; x = 2; y
0

#so how can I change pointers? Do they even exist in Python?
x = 0
y.pointerDestination = x.pointerDestination   #How? By which command?
x = 2
# y should be 0, how?

[Обновление 2: решено]

Возможно, противоречивые утверждения о существовании There are no pointers in Python. и Python does not have the concept of a "pointer" to a simple scalar value.. Выводит ли последний, что есть указатели на что-то еще, аннулируя первое утверждение?

Ответы [ 3 ]

6 голосов
/ 14 февраля 2011

Скалярные объекты в Python неизменны .Если вы используете нескалярный объект, такой как список, вы можете сделать это:

>>> x = [0]
>>> y = x
>>> y[0] = 4
>>> y
[4]
>>> x
[4]
>>> x is y
True

Python не имеет понятия «указатель» на простое скалярное значение.

2 голосов
/ 14 февраля 2011

Не путайте указатели с ссылками.Они не одно и то же.Указатель - это просто адрес объекта.На самом деле у вас нет доступа к адресу объекта в 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 #.Вы не используете указатели на объекты напрямую (хотя вы используете косвенно, поскольку реализации используют закулисные указатели), но ссылаются на объекты.

1 голос
/ 14 февраля 2011

В Python нет указателей.Существуют вещи, называемые ссылками (которые, как и ссылки на C ++, обычно реализуются в указателях, но в отличие от ссылок на C ++ не подразумевают передачу по ссылке).Каждая переменная хранит ссылку на объект, размещенный где-то еще (в куче).Каждая коллекция хранит ссылки на объекты, размещенные где-то еще.Каждый член объекта хранит ссылку на объект, размещенный где-то еще.

Простое выражение x оценивает ссылку, хранящуюся в x - тот, кто его использует, не может определить, что он получен изпеременная.Невозможно получить ссылку на переменную (в отличие от ее содержимого), которая может использоваться для отслеживания изменений этой переменной.Назначения элементов (x[y] = ...) и элементов (x.y = ...) отличаются в одном отношении: они вызывают методы и изменяют существующие объекты вместо перезаписи локальной переменной.Это различие в основном важно при работе со областью видимости, но вы можете использовать любой из них для эмуляции изменчивости для неизменяемых типов (как показано @Greg Hewgill) и для совместного использования изменений состояния через границы функций (def f(x): x = 0 ничего не меняет, ноdef g(x): x.x = 0 делает).Это не полностью зависит от эмуляции передачи по ссылке - если только вы не замените каждую переменную объектом-оберткой, единственной целью которого является сохранение изменяемого свойства val.Это было бы эквивалентно эмуляции передачи по ссылке через указатели в C, но гораздо более громоздко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...