Понимание привязки имени питона

Я пытаюсь прояснить для себя правила Python для "присвоения" значений переменным.

Допустимо ли следующее сравнение между Python и C++?

  1. В C/C++ утверждение int a=7 означает, что память выделена для целочисленной переменной a (количество слева от = знак) и только тогда значение 7 сохраняется в нем.

  2. В Python утверждение a=7 означает, безымянный целочисленный объект со значением 7 (количество на правой стороне =) создается первым и сохраняется где-то в памяти. Тогда имя a связан с этим объектом.

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

C++ создает различные области памяти для a а также bв то время как a а также b кажется, ссылаются на одно и то же место в Python (исходя из вывода функции id())

Код C++

#include<iostream>
using namespace std;
int main(void)
{
  int a = 7;
  int b = a; 
  cout << &a <<  "  " << &b << endl; // a and b point to different locations in memory
  return 0;
}

Выход: 0x7ffff843ecb8 0x7ffff843ecbc

Python: код

a = 7
b = a
print id(a), ' ' , id(b) # a and b seem to refer to the same location

Выход: 23093448 23093448

2 ответа

Решение

Да, ты в основном прав. В Python имя переменной можно рассматривать как ссылку на значение (не в терминах ссылки на C++, хотя это работает аналогично, а просто указывает на то, что оно ссылается на что-то).

Кроме того, путь Python очень похож на C++ int &b = a что просто означает a а также b обратитесь к тому же значению.

Или C int *pb = &a, что значит a а также *pb ссылаются на ту же ценность, но со всей путаницей, которая приносит людям, которые еще не приняли мозговую слабость C:-)

Присвоение имени переменной в Python заставляет имя ссылаться на другое значение, оно никогда не копирует само значение:

a = 7   # Create "7", make "a" refer to it.
b = a   # make "b" refer to  the "7" as well.
a = 42  # Create "42", make "a" refer to it, b still refers to the "7".

(Я говорю "создать", но это не обязательно так - если значение где-то уже существует, оно может использовать его повторно).

На C-подобном языке это второе утверждение b = a создает новое значение, копирует в него "7" и затем называет b, В Python это просто заканчивается a а также b ссылаясь на то же значение.

Если базовые данные неизменны (их нельзя изменить), это обычно заставляет Python выглядеть так, как будто он ведет себя идентично тому, как это делает C.

Но для изменчивых данных (таких же, как использование указателей в C или ссылок в C++), люди могут иногда удивляться, потому что они не понимают, что значение, стоящее за ними, может быть разделено:

>>> a = [1,2,3] ; print a
[1, 2, 3]

>>> b = a ; print b
[1, 2, 3]

>>> a[1] = 42 ; print a
[1, 42, 3]

>>> print b   #WTH?
[1, 42, 3]

Есть способы получить независимые копии значения с такими вещами, как:

b = a[:]
b = [item for item in a]

(который будет работать на одном уровне, где b = a работает до нулевого уровня), или используя deepcopy если вы хотите, если полностью уникален, на любой уровень необходим.

В вашем примере кода, поскольку "int" является встроенным типом в C++, поэтому оператор "=" не может быть перегружен, но "=" не всегда создает новый объект, они также могут ссылаться на один и тот же объект. Объектный модуль python похож на Java, большая часть объекта является ссылкой, а не копией.

Вы также можете попробовать это:

a = 7
b = 7
print id(a), ' ' , id(b) 

выводит тот же результат, так как python найдет и a, и b указывают на одну и ту же переменную const

Другие вопросы по тегам