A Pythonban az összehasonlító operátor (más néven relációs operátor) két operandus értékét vizsgálja, és Boolean True vagy False értéket ad vissza aszerint, hogy a comparison feltétel teljesül-e vagy sem.
Az alábbi táblázat a leggyakoribb összehasonlító operátorokat mutatja be a Pythonban:
| Operátor | Művelet | Leírás |
|---|---|---|
> |
„nagyobb, mint” |
a > b akkor True, ha a értéke szigorúan nagyobb, mint b értéke |
< |
„kisebb, mint” |
a < b akkor True, ha a értéke szigorúan kisebb, mint b értéke |
== |
„egyenlő” |
a == b akkor True, ha a értéke szigorúan egyenlő b értékével |
>= |
„nagyobb vagy egyenlő” |
a >= b akkor True, ha a > b VAGY a == b
|
<= |
„kisebb vagy egyenlő” |
a <= b akkor True, ha a < b vagy a == b
|
!= |
„nem egyenlő” |
a != b akkor True, ha a == b értéke False
|
is |
„azonosság” |
a is b akkor True, ha és csakis akkor, ha a és b ugyanaz az objektum
|
is not |
„tagadott azonosság” |
a is not b akkor True, ha és csakis akkor, ha a és b nem ugyanaz az objektum
|
in |
„tartalmazásvizsgálat” |
a in b akkor True, ha a tagja, részhalmaza vagy eleme b-nek |
not in |
„tagadott tartalmazásvizsgálat” |
a not in b akkor True, ha a nem tagja, részhalmaza vagy eleme b-nek |
Mindegyikük azonos prioritású (ez magasabb, mint a Boolean-műveleteké, de alacsonyabb, mint az aritmetikai vagy bitenkénti műveleteké).
A különböző típusú objektumok (a numerikus típusok kivételével) alapértelmezés szerint soha nem lesznek egyenlők.
Egy class nem azonos példányai szintén nem számítanak egyenlőnek, hacsak a class nem definiál speciális gazdag összehasonlító metódusokat, amelyek testre szabják az object alapértelmezett összehasonlítási viselkedését.
Ennél (sokkal) részletesebb leírásért lásd az Értékek összehasonlítása szakaszt a Python dokumentációjában.
A numerikus típusok (többnyire) kivételt képeznek ez alól a típusegyeztetési szabály alól.
Egy integer egyenlőnek tekinthető egy float típussal (vagy egy octal egy hexadecimal típussal), amennyiben a típusok az összehasonlításhoz implicit módon átalakíthatók.
A többi numerikus típusnál (complex, decimal, fractions) az összehasonlító operátorok ott vannak definiálva, ahol „van értelmük” (ahol az implicit átalakítás nem változtatja meg az eredményt), de TypeError hibát dobnak, ha a mögöttes objektumok nem alakíthatók pontosan át az összehasonlításhoz.
A numerikus átalakítás szabályairól, amelyeket a Python használ, bővebben az aritmetikai átalakítások szakaszban olvashatsz a Python dokumentációjában.
>>> import fractions
# A string cannot be converted to an int.
>>> 17 == '17'
False
# An int can be converted to float for comparison.
>>> 17 == 17.0
True
# The fraction 6/3 can be converted to the int 2
# The int 2 can be converted to 0b10 in binary.
>>> 6/3 == 0b10
True
# An int can be converted to a complex
# number with a 0 imaginary part.
>>> 17 == complex(17)
True
# The fraction 2/5 can be converted to the float 0.4
>>> 0.4 == 2/5
True
>>> complex(2/5, 1/2) == complex(0.4, 0.5)
True
Ha egy számot rendezés szerint összehasonlítasz egy NaN (nem szám) típussal, az eredmény False lesz.
A NaN Python-beli definíciójának zavarba ejtő mellékhatása, hogy a NaN soha nem egyenlő önmagával.
Ha kíváncsi vagy rá, miért definiálták a NaN-t így a Pythonban, ez a Stack Overflow-poszt a NaN-ról a nemzetközi szabvány megalkotásáról érdekes olvasmány.
>>> x = float('NaN')
>>> 3 < x
False
>>> x < 3
False
# NaN never compares equal to NaN
>>> x == x
False
A stringeket (str) lexikográfiailag hasonlítjuk össze, az egyedi Unicode-kódpontjaik alapján (amit úgy kapunk, hogy a str minden kódpontját átadjuk a beépített ord() függvénynek, amely egy int értéket ad vissza).
Ha a két string összes kódpontja megegyezik, és ugyanabban a sorrendben követik egymást, a két string egyenlőnek számít.
Ez az összehasonlítás „páronkénti” módon történik: elsőt az elsővel, másodikat a másodikkal, és így tovább.
A Python 3.x-ben a str és a bytes nem konvertálható és nem hasonlítható össze közvetlenül.
>>> 'Python' > 'Rust'
False
>>> 'Python' > 'JavaScript'
True
# Examples with Mandarin.
# hello < goodbye
>>> '你好' < '再见'
True
# ord() of first characters
>>> ord('你'), ord('再')
(20320, 20877)
# ord() of second characters
>>> ord('好'), ord('见')
(22909, 35265)
# And with Korean words.
# Pretty < beautiful.
>>> '예쁜' < '아름다운'
False
>>> ord('예'), ord('아')
(50696, 50500)
A konténer adattípusok (lists, tuples, sets, dicts stb.) szintén lexikográfiailag hasonlítódnak össze: akkor egyenlők, ha mindkét konténer ugyanazokat az adatokat és ugyanazokat az adattípusokat tartalmazza (lists és tuples esetén a sorrendjüknek is meg kell egyeznie), egyébként nem egyenlők.
>>> [1, 2] == [1, 2]
True
# But if the data is not in the same order, they are not equal.
>>> [2, 1] == [1, 2]
False
# The same holds true for tuples
>>> (3,4,5) == (5,4,3)
False
# Length is also compared
>>> [1, 2] < [1, 2, 3]
True
# Comparing dicts
>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 18}
False
>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 19}
True
Az összehasonlító operátorok tetszőlegesen láncolhatók.
Fontos, hogy egy kifejezés kiértékelése left-tól right felé halad.
Például az x < y <= z egyenértékű az x < y and y <= z kifejezéssel, azzal a kivétellel, hogy y csak egyszer kerül kiértékelésre.
Mindkét esetben z egyáltalán nem kerül kiértékelésre, ha x < y értéke False.
Ezt gyakran short-circuit evaluation-nek nevezik: a kiértékelés leáll, ha a kifejezés igazságértéke már megállapítható.
A Short circuiting-et több Boolean-operátor és függvény támogatja, valamint a Pythonban az összehasonlítások láncolása is.
Sok más programozási nyelvtől eltérően, többek között a C, C++, C# és Java nyelvtől, a Pythonban az a < b < c-hez hasonló láncolt kifejezéseknek hagyományos matematikai értelmezése és precedenciája van.
>>> x = 2
>>> y = 5
>>> z = 10
>>> x < y < z
True
>>> x < y > z
False
>>> x > y < z
False
Az is és az is not operátor egy objektum azonosságát vizsgálja, szemben az objektum értékével.
Egy objektum azonossága a létrehozása után soha nem változik, és az id() függvénnyel deríthető ki.
A <apple> is <orange> akkor True, ha és csakis akkor, ha id(<apple>) == id(<orange>).
A <apple> is not <orange> ennek az ellenkezőjét adja.
Mivel egyedi (singleton) értékek, a None és a NotImplemented összehasonlításához mindig az is és az is not operátort használd.
Erről a konvencióról bővebben a Python referenciadokumentációjának értékek összehasonlítása szakaszában és a PEP8 útmutatóban olvashatsz.
# A list of favorite numbers.
>>> my_fav_numbers = [1, 2, 3]
>>> your_fav_numbers = my_fav_numbers
>>> my_fav_numbers is your_fav_numbers
True
# The returned id will differ by system and Python version.
>>> id(my_fav_numbers)
4517478208
# your_fav_numbers is only an alias pointing to the original my_fav_numbers object.
# Assigning a new name does not create a new object.
>>> id(your_fav_numbers)
4517478208
>>> my_fav_numbers is not your_fav_numbers
False
>>> my_fav_numbers is not None
True
>>> my_fav_numbers is NotImplemented
False
Az in és a not in operátor a tagságot vizsgálja.
A <fish> in <soup> akkor True, ha <fish> tagja <soup>-nak (azaz ha <fish> részhalmaza <soup>-nak, vagy benne foglaltatik), egyébként False.
A <fish> not in <soup> a tagadását, vagyis a <fish> in <soup> ellentétét adja vissza.
String- és bytes-típusok esetén a <name> in <fullname> akkor True, ha és csakis akkor, ha <name> részstringje a <fullname>-nek.
# A set of lucky numbers.
>>> lucky_numbers = {11, 22, 33}
>>> 22 in lucky_numbers
True
>>> 44 in lucky_numbers
False
# A dictionary of employee information.
>>> employee = {'name': 'John Doe', 'id': 67826, 'age': 33, 'title': 'ceo'}
# Checking for the membership of certain keys.
>>> 'age' in employee
True
>>> 33 in employee
False
>>> 'lastname' not in employee
True
# Checking for substring membership
>>> name = 'Super Batman'
>>> 'Bat' in name
True
>>> 'Batwoman' in name
False
Az objektumok összehasonlítási viselkedése a rich comparison methods implementálásával szabható testre.
További információért lásd a Python Tutorial: osztályok, a Python-osztályok és mágikus metódusok (Dan Bader) és a Speciális metódusnevek oldalt.