Ссылки и копии в python

Так что я пробовал несколько вещей в python и случайно встретил это:

>>> a = 10 >>> b = 10 >>> a is b True 

Видимо при создании переменной b Python замечает, что есть уже другая (другая) переменная со значением 10 и просто создает ссылку на нее (просто для экономии памяти, может быть?). Поскольку целые числа неизменны (по крайней мере, я думаю, что они есть), это имеет какой-то смысл. Но потом я попробовал то же самое с большим числом и получил это:

 >>> a = 100200103847239642631982367 >>> b = 100200103847239642631982367 >>> a is b False 

Здесь по какой-то причине Python, похоже, создает другой объект int вместо того, чтобы сделать переменную b ссылкой на переменную a , что для меня не имеет смысла. Предполагая, что ссылки, созданные в первом примере, – это сохранение памяти, не было бы еще более эффективным создание ссылки в последнем случае также, поскольку числа намного больше?

Обычно Python кэширует целые числа от -5 до 256 (хотя это может различаться между реализацией); когда два имени указывают на одно и то же кешированное целое число, они имеют одинаковый идентификатор и, следовательно, указывают на один и тот же объект:

 >>> c = 10 >>> d = 10 >>> id(c) == id(d) True >>> c is d True 

Однако, если вы нарушите этот порог кэша, идентификаторы изменятся:

 >>> e = 256 >>> d = 256 >>> id(e) == id(d) True >>> d = 257 >>> e = 257 >>> id(d) == id(e) False >>> d is e False >>> f = -5 >>> g = -5 >>> id(f) == id(g) True >>> f = -6 >>> g = -6 >>> id(f) == id(g) False 

Вы видите тот же эффект.

Имейте в виду, что это не сравнивает значения, не используйте is когда вы действительно имеете в виду «равно»:

 >>> 10 * 1000 is 10000 False >>> 10 * 1000 == 10000 True