Python кортеж из идентификаторов целых чисел или списков

В Python 3.3 для Windows каждый список получает свой идентификатор при создании:

>>> id([3])
46555784
>>> id([3])
47920192
>>> id([4])
46532048

Но если я напишу кортеж, запрашивающий идентификаторы двух списков, каждый список, похоже, получит одинаковый идентификатор:

>>> id([3]), id([4])
(43079000, 43079000)

Я ожидал кортеж с двумя разными идентификаторами. В чем причина такого поведения?

1 ответ

Согласно документации Python 3.3 id идентификатор для CPython дает адрес памяти объекта.

Когда я попытался сделать следующее:

print(id([3]))
print(id([4]))
print(id([5]))
print((id([3]), id([4])))

Я получил один и тот же адрес памяти для каждого из списков.

Однако, если вы делаете следующее:

print(id([3]))
print(id([4]))
print(id([5]))
i = [3]
j = [4]
print((id(i), id(j)))

Первые 3 оператора печати и первый идентификатор кортежа были одинаковыми, но второй идентификатор в кортеже был другим. Это имеет смысл, потому что два разных объекта создаются и присваиваются, а затем идентифицируются идентификаторы.

Но они были в скрипте Python, а не в интерактивном режиме, как предполагает ваш пост. Тем не менее, я получил те же результаты в интерактивном режиме.

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

Я повторял комментарий Блендера, в котором я получал бы все те же результаты идентификатора, если бы я не объявил массив или не было вложенных массивов.

Когда я попробовал что-то вроде этого:

print(id([3]), id([3]))
print(id([3]), id([3,[3]]))

Идентификаторы первого оператора печати имели тот же результат, но идентификаторы второго оператора печати были разными, но один из идентификаторов имел тот же идентификатор, что и первый оператор печати.

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