Целочисленные адреса Python 3 - PullRequest
0 голосов
/ 01 сентября 2018
x=300
y=300
print(id(x),id(y))
a=[300,300]
print(id(a[0]),id(a[1]))

При выполнении кода выше я получаю разные адреса для x и y, но один и тот же адрес для a[0] и a[1]. Кто-нибудь может сказать мне, почему это происходит?

1 Ответ

0 голосов
/ 03 сентября 2018

Посмотрите на приведенный ниже пример:

    >>> a=256
    >>> b=256
    >>> print(id(a),id(b))
    (31765012, 31765012)
    >>> 
    >>> c=257
    >>> d=257
    >>> print(id(c),id(d))
    (44492764, 44471284)
    >>> 

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

В CPython функцией C-API, которая обрабатывает создание нового объекта int, является PyLong_FromLong(long v). см. документацию по этой ссылке

РЕДАКТИРОВАТЬ: Теперь перейдем к списку. Для одинаковых элементов списка (большие целые числа) вы получаете одинаковые идентификаторы, поскольку список создается сразу или вы можете сказать это за один раз.

Вы также можете добиться аналогичного поведения с целыми числами, см. Пример ниже с параллельным присваиванием.

    >>>
    >>> a,b = 300,300
    >>>
    >>> print(id(a),id(b))
    (36132288, 36132288)
    >>>

Надеюсь, это рассеет ваши сомнения.

...