2016-09-15 13:31 GMT+02:00 Andrej T. <
andrejtr...@gmail.com>:
> Мислам дека е имплементациска финта поврзана со integers и identity.
>
> Во Python сѐ е објект, па и integers. Кога ќе стартуваш интерпретер, без
> разлика на кодот од програмот, првите 256 броеви ги инстанцира и ги чува во
> глобалниот scope, заради некаква оптимизација. Компајлерот 1 + 1 го
> преведува во пристап до 2, па затоа 2 is 2 == True.
>
> А во случајот на 999 + 1, прво креира два нови објекти за 999 (со некое ID
> 1234) и 1000 (ID 1235). Потоа повикува __add__(self, 1) и резултатот е нов
> објект од тип Integer со вредност 1000 (ID 9999).
>
> Кога на крај ги споредува првиот објект 1000 (ID 1234) со вториот (ID 9999)
> операторот "is" враќа false затоа што тестира идентитет.
Да, убаво кажува на линкот што го пуштив:
The explanation for this behavior is that Python maintains a pool of
objects representing the first few hundred integers and reuses them to
save on memory and object creation. To make it even more confusing,
the definition of what "small integer" is differs across Python
versions.
A mitigation here is to never use the is operator for value
comparison. The is operator is designed to deal exclusively with
object identities.