Sammenligning af strenge i Python: is vs. ==

Jeg bemærkede, at et Python-script, som jeg var ved at skrive, opførte sig underligt, og sporede det til en uendelig løkke, hvor løkkebetingelsen var while line is not ''. Da jeg kørte det igennem i debuggeren, viste det sig, at linjen faktisk var ''. Da jeg ændrede den til !=''' i stedet for is not ''', virkede det fint.

Er det generelt set også bedre at bruge '==' som standard, selv når man sammenligner int- eller boolske værdier? I've always liked to use 'is' because I find it more aesthetically pleasing and pythonic (which is how I fell into this trap...), but I wonder if it's intended to just be reserved for when you care about finding two objects with the same id.

Løsning

For alle indbyggede Python-objekter (som f.eks. strenge, lister, dicts, funktioner, osv.), hvis x er y, så er x==y også sandt.

Ikke altid. NaN er et modeksempel. Men normalt forudsætter identitet (er) lighed (==). Det omvendte er ikke sandt: To forskellige objekter kan have samme værdi.

Desuden, anses det generelt for bedre at bruge '==' som standard, selv ved sammenligning af int- eller boolske værdier?

Man bruger == når man sammenligner værdier og is når man sammenligner identiteter.

Når du sammenligner ints (eller uforanderlige typer generelt), vil du stort set altid bruge førstnævnte. Der findes en optimering, der gør det muligt at sammenligne små integers med is, men du skal ikke stole på den.

For boolske værdier bør du slet ikke foretage sammenligninger. I stedet for:

if x == True:
    # do something

write:

if x:
    # do something

Ved sammenligning mod None er is None at foretrække frem for == None.

I've altid gerne brugt 'is' fordi Jeg finder det mere æstetisk tiltalende og pythonisk (hvilket er hvordan jeg faldt ind i denne fælde...), men jeg spekulerer på, om det's beregnet til bare at være forbeholdt, når du bekymrer dig om at finde to objekter med samme id.

Ja, det er præcis det, den er beregnet til.

Kommentarer (18)

Jeg vil gerne vise et lille eksempel på, hvordan is og == er involveret i uforanderlige typer. Prøv det:

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

is sammenligner to objekter i hukommelsen, == sammenligner deres værdier. Du kan f.eks. se, at små hele tal lagres i cachen af Python:

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

Du bør bruge == når du sammenligner værdier og is når du sammenligner identiteter. (Fra et engelsk synspunkt er "equals" også forskelligt fra "is").

Kommentarer (4)

Se Dette spørgsmål

Din logik ved læsning

For alle indbyggede Python-objekter (som f.eks. strings, lister, dicts, funktioner, osv.), hvis x er y, så er x==y også sandt.

er lidt mangelfuld.

Hvis is gælder, så er == sandt, men det gælder IKKE omvendt. == kan give True, mens is giver False.

Kommentarer (2)