Здравейте,
наскоро попаднах на пример с оператор 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.