Már van néhány pontos válaszod. Itt adok egy vissza az alapokhoz választ.
Mi az a ==
?
A Python ==
azt jelenti, hogy a bal oldali érték megegyezik a jobb oldali értékkel.
sum([5, 7]) == (48 * 3)**0.5
a True
. Több kiértékelési lépés szükséges ahhoz, hogy minden kifejezés elérje az 12
értéket. Még ekkor is az egész szám 12
összehasonlításra kerül a lebegő 12.0
értékkel, ezért az egész számot lebegőponttá kell véglegesen átalakítani.
A lényeg: minden kifejezést a rendszer kiértékel, és az eredményül kapott értékeket összehasonlítja. Ha egyenlőek, akkor a kifejezés igaz.
Mi az a is
?
A Python is
viszont azt jelenti, hogy a bal oldali név ugyanarra az objektumra mutat, mint a jobb oldali név.
a = 3.14159
b = a
a is b
a True
. a
hozzá lett rendelve a 3.14159
értékhez. De ami még ennél is fontosabb, van egy memóriablokk, amely egy objektumot tartalmaz, ami jelen esetben a float 3.14159. a
az adott objektumra/memóriablokkra mutat. A b
a a
-ra mutat, ami azt jelenti, hogy ugyanarra a memóriablokkra mutat.
Ezt nagyon egyszerűen tesztelheti: hozzon létre két nevet, amelyek egyszerűen egy számra mutatnak, és hasonlítsa össze őket a is
használatával, és nem fognak egyezni:
>>> a = 1239481203948
>>> b = 1239481203948
>>> a is b
False
Ez hamis, mert most két különböző helyünk van a memóriában/objektumban, amelyek mindegyikre mutatnak:
>>> id(a)
140402381635344
>>> id(b)
140402391174416
(A gépén egy másik id
s készletet kap. )
Tehát valójában teret vesztegettél, mert két objektum ugyanazon információ számára foglal helyet.
De várj, van még
Ha egyedül játszol ezzel, tonna kivételt találsz az általam leírtak alól, és összezavarod magad. Íme néhány:
>>> a = 157
>>> b = 157
>>> a is b
True
Mit?? Miért igaz ez? A Python optimalizálása érdekében a leggyakoribb számokat optimalizáltuk. Lehet, hogy tévedek, de emlékszem, hogy a memóriában van kijelölt hely a leggyakoribb számok számára. És ezek az első néhány száz egész szám, és néhány másik.
De vannak más optimalizációk is:
>>> a = None
>>> b = None
>>> a is b
True
>>> a = True
>>> b = True
>>> a is b
True
Ezek mind továbbra is ugyanazt a szabályt követik, mint korábban kifejtettem: az oka annak, hogy a is
kiértékelődik True
-re, mert a a
és a b
is ugyanarra a helyre mutat a memóriában/objektumban.
Ez ezekben a furcsa esetekben történik a Pythonban végzett optimalizálás miatt. De általánosságban elmondható, hogy az egyetlen módja annak biztosítására, hogy a is
kiértékelése True
-ra legyen, az az, ha egy név van hozzárendelve egy objektumhoz, amelynek már van neve, például amikor azt írtuk:
>>> a = 3.14159
>>> b = a
>>> a is b
True
írás helyett
>>> a = 3.14159
>>> b = 3.14159
>>> a is b
False
22.02.2021