Porównanie łańcuchów w Pythonie: is vs. = =[duplikat]

To pytanie ma już odpowiedź tutaj:

Zauważyłem, że skrypt Pythona, który pisałem, działał dziwnie, i wyśledziłem go do nieskończonej pętli, gdzie warunek pętli był while line is not ''. Przechodząc przez nią w debuggerze, okazało out that line was in fact ''. Kiedy zmieniłem go na !='' zamiast is not '', działało dobrze.

Czy ogólnie uważa się, że lepiej jest po prostu używać '==' domyślnie, nawet podczas porównywania wartości Int lub Boolean? Zawsze lubiłem używać "is", ponieważ uważam, że jest bardziej estetyczny i pythoniczny (tak wpadłem w tę pułapkę...), ale zastanawiam się, czy ma to być zarezerwowane tylko dla osób, które troszczą się o znalezienie dwóch obiektów o tym samym id.

Author: Coquelicot, 2010-06-07

4 answers

Dla wszystkich wbudowanych obiektów Pythona (jak ciągi, listy, dicty, funkcje, itd.), jeśli x jest y, to x= = y jest również Prawda.

Nie zawsze. NaN to kontrprzykład. Jednak zazwyczaj, tożsamość (is) implikuje równość (==). Converse nie jest prawdą: dwa różne obiekty mogą mieć tę samą wartość.

Również, czy ogólnie uważa się, że lepiej jest po prostu używać '==' domyślnie, nawet porównując wartości Int lub Boolean?

Ty użyj {[3] } podczas porównywania wartości i is podczas porównywania tożsamości.

Porównując int (lub niezmienne typy w ogóle), prawie zawsze chcesz tego pierwszego. Istnieje optymalizacja, która pozwala porównywać małe liczby całkowite z is, ale nie polegaj na niej.

Dla wartości logicznych, nie powinieneś w ogóle porównywać. Zamiast:

if x == True:
    # do something

Napisz:

if x:
    # do something

Dla porównania z None, is None jest preferowana w stosunku do == None.

Zawsze lubiłem używać 'jest', ponieważ Uważam to za bardziej estetyczne i pythonic (czyli jak wpadłem w ta pułapka...), ale zastanawiam się, czy to przeznaczone do zarezerwowania tylko wtedy, gdy zależy ci na znalezieniu dwóch obiektów z tym samym identyfikatorem.

Tak, dokładnie do tego służy.
 545
Author: dan04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 11:53:00

Chciałbym pokazać mały przykład jak is i == są zaangażowane w typy niezmienne. Spróbuj:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

is porównuje dwa obiekty w pamięci, == porównuje ich wartości. Na przykład, możesz zobaczyć, że małe liczby całkowite są buforowane przez Pythona:

c = 1
b = 1
>>> b is c
True

Należy używać == podczas porównywania wartości i is podczas porównywania tożsamości. (Również z angielskiego punktu widzenia "equals "różni się od"is".)

 233
Author: pygabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 10:14:49

Logika nie jest błędna. Oświadczenie

Jeśli x jest y, to X==y jest również prawdziwe

Powinno nigdy być czytane jako

If x= = y then X is y

Błędem logicznym czytelnika jest założenie, że twierdzenie logiczne jest prawdziwe. Zobacz http://en.wikipedia.org/wiki/Converse_ (logika)

 62
Author: xubio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 05:46:26

Zobacz to pytanie

Twoja logika w czytaniu

Dla wszystkich wbudowanych obiektów Pythona (jak ciągi, listy, dicty, funkcje, itd.), jeśli x jest y, to x= = y jest również Prawda.

Jest nieco wadliwa.

Jeśli is ma zastosowanie, to == będzie prawdą, ale nie ma zastosowania odwrotnie. == może dać True, podczas gdy is daje False.

 25
Author: pycruft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:37