Програмиране с Python » Форуми » Python

оператори is и ==

(6 posts)

  1. ObiWan
    Member

    Здравейте,
    наскоро попаднах на пример с оператор is и се поразрових из документацията за него. Единственият ред в който е споменат казва че op1 is op2 връща true ако op1 и op2 са един и същ обект. Чудя се какво се има предвид под един и същ обект, малкото тестове които направих показват че различни(като адрес) обекти също връщат true когато имат еднакви стойности, така че единственото ми заключение може да бъде че is е напълно еквивалентно на ==, само че в такъв случай защо ще го включват в езика? Ако някой знае нещо повече по въпроса ще ми е интересно да науча и аз.

    Posted 6 years ago #
  2. Не, различни са. Ако ми каже

    Posted 6 years ago #
  3. Да, операторът 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 #
  4. djv
    Member

    "различни(като адрес) обекти също връщат true когато имат еднакви стойности"

    не е така, 'is' показва точно дали адресите са еднакви

    Posted 6 years ago #
  5. ObiWan
    Member

    ок, мерси много за отговора. Аз между другото за да "избегна" такива присвоявания на еднакви стойности на различни обекти първо ги дефинирах с различни стойности и чак след поне 2-3 аритметични операции ги нагласях да станат едни и същи ... тоя оптимизатор явно много го бива. А какво прави компилатора отдолу всъщност? За всяка новополучена целочислена стойност създава нов обект и когато някоя друга променлива се изчисли към същата стойност я "насочва" към същия вече създаден обект? Всъщност е логично щом всички променливи са просто записи в таблица "име - адрес":)

    Posted 6 years ago #
  6. exabyte
    Member

    Между другото, ефекта с pointer-и до константи в C е същия. Така че това не е нещо специфично за Python :)

    Posted 6 years ago #

RSS feed for this topic

Reply

You must log in to post.