Переменные и адреса памяти

PythonBeginner
Практиковаться сейчас

Введение

В этом уроке мы изучим переменные в Python, адреса памяти и различия между изменяемыми и неизменяемыми типами данных:

  • Неизменяемые типы данных: Эти типы данных не могут быть изменены после создания. Примеры включают int, float, str, tuple и frozenset.
  • Изменяемые типы данных: Эти типы данных могут быть модифицированы после создания. Примеры включают list, dict и set.

При работе с неизменяемыми типами данных любые изменения приводят к созданию нового объекта, в то время как изменяемые типы данных могут быть модифицированы на месте. Понимание этого различия имеет решающее значение при работе с адресами памяти и присвоением переменных.

Мы рассмотрим присвоение переменных, характеристики изменяемых и неизменяемых типов данных, а также оператор is для сравнения адресов памяти. Давайте начнем!

Присваивание переменных и адреса памяти

В Python переменные - это просто ссылки на места в памяти, где хранятся значения. Когда вы присваиваете значение переменной, Python создает новый объект (если необходимо) и делает так, чтобы переменная ссылалась на этот объект.

Откройте сначала интерпретатор Python:

python

Посмотрим на пример:

x = 10
y = x

В этом примере переменной x присваивается значение 10. Когда мы присваиваем x переменной y, обе переменные теперь ссылаются на один и тот же адрес в памяти. Мы можем проверить это с помощью функции id():

print(id(x))  ## Вывод: адрес памяти x
print(id(y))  ## Вывод: адрес памяти y, который должен быть тем же, что и у x

Оператор is

В Python оператор is сравнивает адреса памяти двух объектов. Если адреса памяти совпадают, оператор is возвращает True; в противном случае возвращает False. Это отличается от оператора ==, который сравнивает значения объектов.

x = [1, 2, 3]
y = x
z = [1, 2, 3]

print(x is y)  ## Вывод: True (x и y имеют один и тот же адрес памяти)
print(x is z)  ## Вывод: False (x и z имеют разные адреса памяти)

Сравнить адреса памяти

В этом шаге мы сравним адреса памяти переменных с одинаковым значением.

Пожалуйста, следуйте инструкциям ниже:

## Создайте две целочисленные переменные `a` и `b` с одинаковым значением.
a = 10
b = 10
## Создайте две переменные списка `c` и `d` с одинаковыми элементами.
c = [1, 2, 3]
d = [1, 2, 3]

## Сравните адреса памяти `a` и `b`, а также `c` и `d`.
print(a is b)  ## Вывод: True
print(c is d)  ## Вывод: False

В приведенном выше примере мы создали две целочисленные переменные a и b с одинаковым значением.

Мы также создали две переменные списка c и d с одинаковыми элементами.

Когда мы сравнили адреса памяти a и b, оператор is вернул True. Это потому, что a и b используют один и тот же адрес памяти.

Однако, когда мы сравнили адреса памяти c и d, оператор is вернул False. Это потому, что c и d имеют разные адреса памяти.

Так что это означает?

  1. Неизменяемые типы данных с одинаковым значением могут иметь один и тот же адрес памяти.
  2. Изменяемые типы данных с одинаковым значением имеют разные адреса памяти.

Изменение изменяемого типа данных

Далее мы создадим и изменим изменяемый тип данных вместе.

## Создайте две переменные `x` и `y`, которые ссылаются на один и тот же список.
x = [1, 2, 3]
y = x

## Измените список с использованием переменной `x`.
x.append(4)

## Обратите внимание на изменения в переменной `y`.
print(y)  ## Вывод: [1, 2, 3, 4] (y также отражает изменения, так как x и y используют один и тот же адрес памяти)

В этом примере мы создали две переменные x и y, которые ссылаются на один и тот же список.

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

Изменение неизменяемого типа данных

Наконец, давайте вместе изменим по очереди неизменяемый тип данных.

## Создайте две переменные `a` и `b`, которые ссылаются на одну и ту же строку.
a = "hello"
b = a

## Измените строку с использованием переменной `a`.
a = a + ", world"

## Обратите внимание на изменения в переменной `b`.
print(b)  ## Вывод: "hello" (b не меняется, потому что при изменении строки был создан новый объект)

В этом примере мы создали две переменные a и b, которые ссылаются на одну и ту же строку.

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

Резюме

В этом продвинутом уроке мы углубились в изучение переменных и адресов памяти в Python. Мы обсудили присваивание переменных, изменяемые и неизменяемые типы данных, а также оператор is для сравнения адресов памяти. Мы также практиковали эти концепции на практических упражнениях. Понимание этих продвинутых концепций поможет вам стать более опытным программистом на Python, так как оно дает более глубокое понимание того, как Python управляет памятью и как переменные работают на более низком уровне.