Porównanie łańcuchów w Pythonie: is vs. = =[duplikat]
To pytanie ma już odpowiedź tutaj:
- Dlaczego porównywanie łańcuchów w Pythonie za pomocą '==' lub 'is' czasami daje inny wynik? 14 odpowiedzi
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.
4 answers
Nie zawsze. NaN to kontrprzykład. Jednak zazwyczaj, tożsamość (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.
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
.
Tak, dokładnie do tego służy.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.
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".)
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)
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.
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