Сохранить ссылку на примитивный тип в Python?

Код:

>>> a = 1 >>> b = 2 >>> l = [a, b] >>> l[1] = 4 >>> l [1, 4] >>> l[1] 4 >>> b 2 

Вместо этого я хочу видеть, что когда я устанавливаю l [1] равным 4, переменная b изменяется на 4.

Я предполагаю, что при работе с примитивами они копируются по значению, а не по ссылке. Часто я вижу, что люди испытывают проблемы с объектами и нуждаются в понимании глубоких копий и тому подобных. Я в основном хочу наоборот. Я хочу иметь возможность хранить ссылку на примитив в списке, а затем иметь возможность назначать новые значения этой переменной либо с использованием ее фактического имени переменной b либо ее ссылки в списке l[1] .

Это возможно?

Вы не можете сделать это в Python, но можете приблизиться, если переменные a и b относятся к изменяемым объектам контейнера вместо неизменяемых чисел:

 >>> a = [1] >>> b = [2] >>> lst = [a, b] >>> lst [[1], [2]] >>> lst[1][0] = 4 # changes contents of second mutable container in lst >>> lst [[1], [4]] >>> a [1] >>> b [4] 

В Python нет «примитивов». Все это объект, четные числа. Числа в Python являются неизменяемыми объектами. Таким образом, чтобы иметь ссылку на такое число, что «изменения» к «числу» «видны» через несколько ссылок, эта ссылка должна быть представлена, например, одним списком элементов или объектом с одним свойством.

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

например

 >>> a = [1] >>> b = a >>> a [1] >>> b [1] >>> a[0] = 2 >>> a [2] >>> b [2] 

Я не думаю, что это возможно:

 >>> lst = [1, 2] >>> a = lst[1] # value is copied, not the reference >>> a 2 >>> lst[1] = 3 >>> lst [1, 3] # list is changed >>> a # value is not changed 2 

a относится к исходному значению lst[1] , но прямо не ссылается на него.

Вспомните l[0] как имя, относящееся к объекту a , и a как имя, относящееся к целому.

Целые числа неизменны, вы можете сделать имена для разных целых чисел, но сами целые числа не могут быть изменены.

Раннее было обсуждение: Хранение элементов одного списка, в другом списке – по ссылке – в Python?

Согласно @mgilson, когда l[1] = 4 , он просто заменяет ссылку, а не пытается мутировать объект. Тем не менее, объекты типа int в любом случае неизменяемы.