← Назад к вопросам

Можно ли создать ссылку на ссылку?

1.3 Junior🔥 121 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Можно ли создать ссылку на ссылку?

В Python нельзя создать ссылку на ссылку в классическом понимании, как это существует в C++ или Java. Python использует модель объектного графа, где всё — это объекты, а переменные являются просто именами (bindings), указывающими на эти объекты.

Как работает система ссылок в Python

В Python нет указателей или явных ссылок. Вместо этого:

x = 42
y = x  # y "ссылается" на тот же объект, что и x

Здесь y и x — это два имени для одного и того же целочисленного объекта. Когда мы присваиваем y = x, мы не создаём ссылку на ссылку, а просто создаём ещё одно имя для того же объекта.

Можно ли эмулировать ссылку на ссылку?

Да, но через обходные пути. Самый распространённый способ — использование списков, словарей или объектов:

# Способ 1: Через список (изменяемый контейнер)
ref = [42]
ref_to_ref = [ref]

print(ref_to_ref[0][0])  # 42
ref[0] = 100
print(ref_to_ref[0][0])  # 100
# Способ 2: Через словарь
data = {"value": 42}
ref = {"pointer": data}

print(ref["pointer"]["value"])  # 42
data["value"] = 100
print(ref["pointer"]["value"])  # 100
# Способ 3: Через кастомный класс
class Reference:
    def __init__(self, obj):
        self.obj = obj

x = [42]
ref = Reference(x)

print(ref.obj[0])  # 42
x[0] = 100
print(ref.obj[0])  # 100

Использование ctypes для работы с адресами памяти

Если нужна полная имитация указателей на указатели, можно использовать ctypes:

import ctypes

# Создаём целое число и получаем его адрес
x = ctypes.c_int(42)
x_addr = ctypes.addressof(x)

# Создаём указатель на адрес
pointer_to_x = ctypes.POINTER(ctypes.c_int)(x_addr)
pointer_to_pointer = ctypes.pointer(pointer_to_x)

print(pointer_to_pointer.contents.contents.value)  # 42

Изменяемость и неизменяемость

Важное различие: для изменяемых типов (списки, словари, объекты) изменения видны через все ссылки:

original_list = [1, 2, 3]
ref1 = original_list
ref2 = ref1

original_list.append(4)
print(ref1)  # [1, 2, 3, 4]
print(ref2)  # [1, 2, 3, 4]

Для неизменяемых типов (числа, строки, кортежи) это невозможно:

x = 42
y = x
y = 100  # Это не изменяет x, создаёт новую привязку
print(x)  # 42

Практический вывод

Нет, в Python нельзя создать ссылку на ссылку в традиционном смысле. Язык не предоставляет механизма для прямого создания ссылок. Однако для большинства практических задач используются контейнеры (списки, словари) или объекты, которые обеспечивают необходимую функциональность.