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.
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.
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").
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.