Чому порівняння рядків за допомогою '==' або 'is' іноді дає різний результат?

У мене є програма на Python, в якій дві змінні встановлюються в значення публічні. В умовному виразі у мене є порівняння var1 is var2, яке не спрацьовує, але якщо я зміню його на var1 == var2, то воно повертає True.

Тепер, якщо я відкриваю свій інтерпретатор Python і роблю те саме порівняння "is", то воно спрацьовує успішно.

>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True

Що я тут упускаю?

Рішення

is - це перевірка на ідентичність, == - це перевірка на рівність. те, що відбувається у вашому коді, в інтерпретаторі буде емулюватися ось так:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

Отже, не дивно, що вони не однакові, чи не так?

Іншими словами: is - це id(a) == id(b).

Коментарі (12)

Ключове слово is є перевіркою на ідентичність об'єкта, а == є порівнянням значень.

Якщо ви використовуєте is, результат буде істинним тоді і тільки тоді, коли об'єкт є тим самим об'єктом. Однак, == буде істинним у будь-якому випадку, коли значення об'єкта однакові.

Коментарі (0)

Я думаю, що це пов'язано з тим, що коли порівняння отримує значення false, використовуються два різних об'єкти. Якщо воно отримує значення true, це означає, що внутрішньо воно використовує той самий точний об'єкт, а не створює новий, можливо, тому що ви створили їх протягом частки 2 або близько того секунд, і тому що немає великого розриву в часі між оптимізацією і використанням одного і того ж об'єкту.

Ось чому ви повинні використовувати оператор рівності ==, а не is, щоб порівняти значення рядкового об'єкта.

>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>> 

У цьому прикладі я зробив s2, який був іншим рядковим об'єктом, раніше рівним 'one', але це не той самий об'єкт, що і ``, тому що інтерпретатор не використовував той самий об'єкт, що і я, не присвоївши його спочатку 'one', якби я це зробив, то зробив би їх однаковими об'єктами.

Коментарі (2)