За прошедшие годы я прочитал несколько постов, в которых переменные Python объяснялись как «у Python есть имена, у других языков есть переменные» или как «объекты, теги и блоки»
Мне всегда не нравились подобные объяснения, поскольку они требовали новых мысленных образов и, на мой взгляд, пытаются переопределить общую терминологию. (Возможно, в Python тоже есть переменные, а в других языках тоже есть имена.)
Поскольку я когда-либо занимался только правильным программированием на Python, я знал только его поведение, поэтому эти обсуждения не сильно повлияли на меня.
Тем не менее, я хотел бы знать, правильно ли мое следующее понимание этой темы, прежде чем защищать его в обсуждениях с другими:
Все переменные Python являются указателями
При написании этого вопроса я заметил, что подобный вопрос задавался ранее, и все в этом потоке, включая OP, пришли к выводу, что переменные Python являются , а не указателями (и вместо этого в ответах использовались приведенные выше объяснения), поскольку
i = 5
j = i
j = 3
print(i)
приводит к 5
. Однако для меня этот результат имеет смысл. В моем понимании это переводится как
void *i;
void *j;
int temp1 = 5; %RHS of line 1 above
i = &temp1; %LHS of line 1 above
j = &i; %Line 2 above
int temp2 = 3; %RHS of line 3 above
j = &temp2; %LHS of line 3 above
(Точнее, есть один ответ на ранее цитированный вопрос, который дает более или менее такое объяснение, но имеет отрицательный балл и не дает комментариев относительно того, что с ним не так.)
Насколько я понимаю, эта модель также прекрасно объясняет параметры в Python, например, объясняет, почему
def foo(b):
b=2
a=1
foo(a)
print(a)
приводит к 1
. В пределах foo
локальная переменная-указатель b
перенаправляется на адрес нового целочисленного объекта. Внешняя переменная-указатель a
по-прежнему указывает на целочисленный объект со значением 1
.
Чтобы получить полную картину и понять, как получить доступ к свойству и почему его можно использовать для изменения переменной, которая передается функции в конце концов, я бы добавил утверждение:
Доступ к свойству с .
в Python переводится как ->
в C ++
Поскольку индексирование является просто синтаксическим сахаром, оно также охватывается этим правилом.
Таким образом, я считаю, что два простых правила объясняют все о переменных в Python. Это смелое утверждение, и я с удовольствием узнаю, если и как , это неправильно.
РЕДАКТИРОВАТЬ: Еще один очень популярный вопрос , ответы которого противоречат аналогии с указателем