Porovnávanie reťazcov v jazyku Python: is vs. ==

Všimol som si, že skript v jazyku Python, ktorý som písal, sa správal čudne, a vystopoval som ho do nekonečnej slučky, kde podmienka slučky bola while line is not ''. Keď som ho prechádzal v debuggeri, ukázalo sa, že tento riadok je v skutočnosti ''. Keď som ho zmenil na !='' namiesto nie je '', fungovalo to dobre.

Okrem toho, je všeobecne považované za lepšie štandardne používať len '==', a to aj pri porovnávaní intových alebo logických hodnôt? Ja'som vždy rád používal 'is', pretože mi to príde estetickejšie a pythonickejšie (čím som sa dostal do tejto pasce...), ale zaujímalo by ma, či je to'určené len na prípady, keď vám záleží na nájdení dvoch objektov s rovnakým id.

Riešenie

Pre všetky vstavané objekty Pythonu (ako napr. reťazce, zoznamy, dicts, funkcie, atď.), ak x je y, potom x==y je tiež Pravda.

Nie vždy. NaN je protipríklad. Ale obvykle z identity (je) vyplýva rovnosť (==). Obrátený postup nie je pravdivý: Dva rôzne objekty môžu mať rovnakú hodnotu.

Takisto sa všeobecne považuje za lepšie používať '==' štandardne, aj keď pri porovnávaní intových alebo logických hodnôt?

Pri porovnávaní hodnôt sa používa == a pri porovnávaní identít je.

Pri porovnávaní intov (alebo všeobecne nemenných typov) chcete v podstate vždy použiť prvý typ. Existuje optimalizácia, ktorá umožňuje porovnávať malé celé čísla pomocou is, ale nespoliehajte sa na ňu.

V prípade logických hodnôt by ste nemali porovnávať vôbec. Namiesto toho:

if x == True:
    # do something

napíšte:

if x:
    # do something

Pri porovnávaní s None sa uprednostňuje is None pred == None.

Vždy som rád používal 'is', pretože považujem ho za estetickejšie a pitoreskné (tak som sa dostal k tejto pasce...), ale zaujímalo by ma, či je to's určený len na to, aby bol vyhradený pre prípad, keď vám záleží na nájdení dvoch objektov s rovnakým id.

Áno, presne na to to slúži.

Komentáre (18)

Chcel by som ukázať malý príklad, ako sa is a == podieľajú na nemenných typoch. Skúste to:

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

is porovnáva dva objekty v pamäti, == porovnáva ich hodnoty. Môžete si napríklad všimnúť, že malé celé čísla sú v Pythone ukladané do vyrovnávacej pamäte:

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

Pri porovnávaní hodnôt by ste mali používať == a pri porovnávaní identít is. (Z anglického hľadiska sa tiež "equals" líši od "is").

Komentáre (4)

Pozri Táto otázka

Vaša logika pri čítaní

Pre všetky vstavané objekty Pythonu (ako napr. reťazce, zoznamy, dicts, funkcie, atď.), ak x je y, potom x==y je tiež pravda.

je mierne chybné.

Ak platí je, potom == bude Pravda, ale NEplatí to naopak. == môže dať True, zatiaľ čo is dá False.

Komentáre (2)