Python 3.6: адрес памяти значения против адреса памяти переменной - PullRequest
0 голосов
/ 11 июня 2018

В настоящее время я использую Python 3.6, и я играл с функцией id ().Когда я запускаю следующий код в IDLE,

x = 1

print (id (x), id (1))

Два адреса памяти совпадают.(1499456272 для меня) Насколько я понимаю, целое число 1, которое является объектом, имеет адрес памяти, и когда объект назначается для x, переменная получает тот же адрес памяти объекта.(не уверен, что это правильно)

Когда я повторяю приведенный выше код, используя строку, например

s = "a"

print (id (s),id ("a"))

Я также получаю два одинаковых адреса памяти.Опять же, мои нынешние рассуждения о том, почему это происходит, такие же, как и выше.

Однако, когда я пытаюсь сделать это с помощью списков, я не получаю тот же адрес памяти.Например,

l = [1]

print (id (l), id ([1]))

дает мне 1499456272 и 67146456.

Может кто-нибудь объяснить мне, почему это происходит?Возможно, мои нынешние рассуждения о том, почему целые и строковые значения имеют одинаковый адрес памяти, ошибочны.Спасибо: D

1 Ответ

0 голосов
/ 12 июня 2018

Python интернирует все целые числа от -5 до 256, а также строковые литералы.Это означает, что всякий раз, когда вы получаете такое значение, Python знает, что у него есть его копия в памяти, и возвращает один и тот же объект.

Хотя, способ, которым это происходит, различен для обоих типов.

Дляцелые числа, эти значения всегда интернированы, что позволяет процессу быть динамическим.

С другой стороны, интернирование строк происходит при компиляции и, таким образом, специфично для строковых литералов.

Мы можем провести некоторый экспериментс is, что эквивалентно сравнению id.

x = 1 + 1
y = 3 - 1
x is y # True

x = 'b'
y = 'b'
x is y # True

x = 257
y = 257
x is y # False

x = 'ab'.replace('a', '')
y = 'b'
x is y # False

Хотя это не относится к объектам других типов, таких как list, а именно потому, что они изменчивы, так что вы абсолютноне хотел бы, чтобы возвращался тот же объект.

[] is [] # False

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

...