Здравейте,
наскоро попаднах на пример с оператор is и се поразрових из документацията за него. Единственият ред в който е споменат казва че op1 is op2 връща true ако op1 и op2 са един и същ обект. Чудя се какво се има предвид под един и същ обект, малкото тестове които направих показват че различни(като адрес) обекти също връщат true когато имат еднакви стойности, така че единственото ми заключение може да бъде че is е напълно еквивалентно на ==, само че в такъв случай защо ще го включват в езика? Ако някой знае нещо повече по въпроса ще ми е интересно да науча и аз.
Програмиране с Python » Форуми » Python
оператори is и ==
(6 posts)-
Posted 6 years ago #
-
Не, различни са. Ако ми каже
Posted 6 years ago # -
Да, операторът
is
, наистина проверява дали два обекта са един и същи. Обаче има една малка особеност на присвояването в Python.Първо — ще предположа, че си правил опитите си главно с низове и числа, нали? :)
Те имат едно много важно свойство — веднъж създадени, не могат да бъдат променяни (immutable). Python използва това доколкото е възможно за оптимизации. Ето един малък пример:0 >>> baba = 42 1 >>> dyado = 42 2 >>> baba is dyado True 3>>> baba = [42, 69] 4 >>> dyado = [42, 69] 5 >>> baba is dyado False
На ред 0 се създава обект, който съдържа числото 42. На ред 1, обаче няма смисъл да се създава нов обект, тъй като той съществува в паметта и стойността му никога не може да бъде променена (42 си е 42 дори и атомна бомба да направи всички теменужки оранжеви). Тогава Python просто насочва името
dyado
към вече създадения обект, към който по чиста случайност сочи иbaba
. Заради товаis
ти връща истина.Във втория случай Python обаче не си позволява такива волности и при двете присвоявания създава нови и различни обекти. Не защото не иска да пести ресурси — просто ако насочи и двете имена към един и същи обект, когато променим обекта зад едното, ще променим обекта и зад другото, а ние искаме те да си живеят отделно и независимо.
Posted 6 years ago # -
"различни(като адрес) обекти също връщат true когато имат еднакви стойности"
не е така, 'is' показва точно дали адресите са еднакви
Posted 6 years ago # -
ок, мерси много за отговора. Аз между другото за да "избегна" такива присвоявания на еднакви стойности на различни обекти първо ги дефинирах с различни стойности и чак след поне 2-3 аритметични операции ги нагласях да станат едни и същи ... тоя оптимизатор явно много го бива. А какво прави компилатора отдолу всъщност? За всяка новополучена целочислена стойност създава нов обект и когато някоя друга променлива се изчисли към същата стойност я "насочва" към същия вече създаден обект? Всъщност е логично щом всички променливи са просто записи в таблица "име - адрес":)
Posted 6 years ago # -
Между другото, ефекта с pointer-и до константи в C е същия. Така че това не е нещо специфично за Python :)
Posted 6 years ago #
Reply
You must log in to post.