У мене є програма на 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)
.
Ключове слово is
є перевіркою на ідентичність об'єкта, а ==
є порівнянням значень.
Якщо ви використовуєте is
, результат буде істинним тоді і тільки тоді, коли об'єкт є тим самим об'єктом. Однак, ==
буде істинним у будь-якому випадку, коли значення об'єкта однакові.
Я думаю, що це пов'язано з тим, що коли порівняння отримує значення 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', якби я це зробив, то зробив би їх однаковими об'єктами.