A bite of Python

26 views
Skip to first unread message

Visar Zejnullahu

unread,
Sep 9, 2016, 3:32:24 AM9/9/16
to pyth...@googlegroups.com
https://access.redhat.com/blogs/766093/posts/2592591

Тоа што најмногу ме изненади е:

>>> 1+1 is 2
True

>>> 999+1 is 1000
False

Бонус: http://pythonforengineers.com/this-is-what-python-beginners-have-to-deal-with/

Dalibor Nasevic

unread,
Sep 13, 2016, 8:28:04 AM9/13/16
to pyth...@googlegroups.com
On Fri, Sep 9, 2016 at 9:31 AM, Visar Zejnullahu <visar.ze...@gmail.com> wrote:

Бонус: http://pythonforengineers.com/this-is-what-python-beginners-have-to-deal-with/

Слаба провокација, Висар. Ч)

Vlatce

unread,
Sep 15, 2016, 5:34:36 AM9/15/16
to pyth...@googlegroups.com
Не сум Питон програмер ама ова сигурно има врска нешто со Floating Point броеви. Провери дали има некаква разлика во дробни места после точката.

Ваква зезалица има и во јаваскрипт и тоа баш ради ситна разлика во 0.00001 (пример) дел од броевите. :)

Ама мислам ова го има и во сите програмски јазици ради тоа што компјутерот има ограничена точност т.е број на битови за процесорска инструкција.

Провери дали постои некаков тип на податок што работи со било каква точност на броеви.

Во Јава тоа е BigDecimal

--
You received this message because you are subscribed to the Google Groups "python-mk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python-mk+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Andrej T.

unread,
Sep 15, 2016, 7:31:16 AM9/15/16
to pyth...@googlegroups.com

2016-09-15 11:34 GMT+02:00 Vlatce <vlad...@gmail.com>:
Не сум Питон програмер ама ова сигурно има врска нешто со Floating Point броеви.

Мислам дека е имплементациска финта поврзана со 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 затоа што тестира идентитет.

Или така нешто. :-)
--
Андреј Трајчевски / 078/426-717 / andrejtr...@gmail.com

Visar Zejnullahu

unread,
Sep 15, 2016, 8:11:22 AM9/15/16
to pyth...@googlegroups.com
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.
Reply all
Reply to author
Forward
0 new messages