Чому порівняння рядків за допомогою '==' або 'is' іноді дає різний результат?
У мене є програма на Python, в якій дві змінні встановлюються в значення публічні
. В умовному виразі у мене є порівняння var1 is var2
, яке не спрацьовує, але якщо я зміню його на var1 == var2
, то воно повертає True
.
Тепер, якщо я відкриваю свій інтерпретатор Python і роблю те саме порівняння "is", то воно спрацьовує успішно.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Що я тут упускаю?
1070
3
is
- це перевірка на ідентичність,==
- це перевірка на рівність. те, що відбувається у вашому коді, в інтерпретаторі буде емулюватися ось так:Отже, не дивно, що вони не однакові, чи не так?
Іншими словами:
is
- цеid(a) == id(b)
.Ключове слово
is
є перевіркою на ідентичність об'єкта, а==
є порівнянням значень.Якщо ви використовуєте
is
, результат буде істинним тоді і тільки тоді, коли об'єкт є тим самим об'єктом. Однак,==
буде істинним у будь-якому випадку, коли значення об'єкта однакові.Я думаю, що це пов'язано з тим, що коли порівняння отримує значення false, використовуються два різних об'єкти. Якщо воно отримує значення true, це означає, що внутрішньо воно використовує той самий точний об'єкт, а не створює новий, можливо, тому що ви створили їх протягом частки 2 або близько того секунд, і тому що немає великого розриву в часі між оптимізацією і використанням одного і того ж об'єкту.
Ось чому ви повинні використовувати оператор рівності
==
, а неis
, щоб порівняти значення рядкового об'єкта.У цьому прикладі я зробив s2, який був іншим рядковим об'єктом, раніше рівним 'one', але це не той самий об'єкт, що і ``, тому що інтерпретатор не використовував той самий об'єкт, що і я, не присвоївши його спочатку 'one', якби я це зробив, то зробив би їх однаковими об'єктами.