Ar yra skirtumas tarp „foo yra None“ ir „foo == None“?

Ar yra skirtumas tarp:

 if foo is None: pass 

ir

 if foo == None: pass 

Konvencija, kurią mačiau daugelyje „Python“ kodų (ir kodo, kurį rašau sau), yra pirmasis, bet neseniai atėjau į kodą, kuris naudoja pastarąjį. Nė vienas nėra „NoneType“ egzempliorius (ir tik pavyzdys, IIRC), todėl tai nėra svarbu, ar ne? Ar yra aplinkybių, kuriomis tai įmanoma?

207
25 авг. nustatė Joe Shaw 25 rug. 2008-08-25 21:27 '08 at 9:27 pm 2008-08-25 21:27
@ 11 atsakymų

visada is True jei lygina tą patį objekto pavyzdį.

Nors == galiausiai nustatomas pagal __eq__() metodą

tai yra.

 >>> class Foo(object): def __eq__(self, other): return True >>> f = Foo() >>> f == None True >>> f is None False 
239
25 авг. Atsakymas pateikiamas Brendan 25 rugpjūčio mėn. 2008-08-25 21:38 '08 at 9:38 pm 2008-08-25 21:38

Jūs galite perskaityti šį identifikatorių ir objekto ekvivalentą .

Operatorius „yra“ naudojamas objektui atpažinti, jis tikrina, ar objektai yra susiję su tuo pačiu atveju (tas pats adresas atmintyje).

Ir išraiška „==“ reiškia lygybę (tą pačią vertę).

47
25 авг. atsakymą pateikė borrego 25 rugpjūtis. 2008-08-25 21:48 '08, 21:48, 2008-08-25 21:48

Įspėjimas:

 if foo: # do something 

Jis nėra toks pats kaip:

 if x is not None: # do something 

Pirmasis yra loginė vertė ir gali būti vertinamas kaip klaidingas įvairiuose kontekstuose. Yra daug dalykų, kurie yra klaidingos reikšmės Būlio reikšmių testuose, pavyzdžiui, tuščios talpyklos, loginės vertės. Šioje situacijoje niekas taip pat neįvertina klaidingos vertės, bet taip pat daro ir kitus dalykus.

23
26 авг. Tendayi Mawushe atsakymas rugpjūčio 26 d. 2008-08-26 16:44 '08 at 4:44 pm 2008-08-26 16:44

(ob1 is ob2) , lygus (id(ob1) == id(ob2))

12
25 февр. Atsakymą pateikė Mykola Kharechko vasario 25 d. 2009-02-25 13:34 '09, 13:34 2009-02-25 13:34

Priežastis, kodėl foo is None yra pageidaujamas metodas - galite apdoroti objektą, kuris apibrėžia savo __eq__ , ir kad objektas yra lygus Nėra. Todėl visada naudokite „ foo is None jei jums reikia pamatyti, ar tai yra tikras.

11
29 мая '10 в 0:15 2010-05-29 00:15 atsakymas pateikiamas truppo gegužės 29 d., 10 val. 0:15 2010-05-29 00:15

Nėra jokio skirtumo, nes identiški objektai, žinoma, bus lygūs. Tačiau PEP 8 aiškiai nurodo, kad turite naudoti:

Palyginimas su „ne“ tipo singletonais visada turėtų būti atliekamas naudojant arba ne, o ne lygybės operatorius.

8
19 мая '13 в 18:35 2013-05-19 18:35 Atsakymą pateikė Thijs van Dien gegužės 19 d., 13 val., 6:35, 2013-05-19 18:35

@Jason :

Aš rekomenduoju naudoti kažką didesnio eilėse.

 if foo: #foo isn't None else: #foo is None 

Man nepatinka naudoti „jei foo:“, jei foo tikrai neatitinka loginės vertės (ty 0 arba 1). Jei foo yra eilutė ar objektas ar kažkas kita, „jei foo:“ gali veikti, tačiau man atrodo, kad jis yra tingus. Jei tikrinate, ar x yra „Nėra“, pasakykite „jei x nėra:“.

4
26 авг. atsakymą pateikė Graeme Perrow 26 rug. 2008-08-26 00:35 '08 0:35 am. 2008-08-26 00:35

is bandymai identifikuoti, o ne . Jūsų pareiškimui foo is none , Python tiesiog lygina objektų atminties adresą. Tai reiškia, kad jūs užduodate klausimą "Ar turiu du tos pačios dainos pavadinimus?"

== , kita vertus, lygybės testai, apibrėžti __eq__() metodu. Jis nerūpi asmenybės.

 In [102]: x, y, z = 2, 2, 2.0 In [103]: id(x), id(y), id(z) Out[103]: (38641984, 38641984, 48420880) In [104]: x is y Out[104]: True In [105]: x == y Out[105]: True In [106]: x is z Out[106]: False In [107]: x == z Out[107]: True 

None nėra vieno taško operatorius. Todėl None is None tiesa.

 In [101]: None is None Out[101]: True 
4
19 дек. Atsakymą pateikė ChillarAnand gruodžio 19 d. 2014-12-19 07:05 '14, 07:05 2014-12-19 07:05

Nėra jokio skirtumo tarp lygybės (==) ir tapatybės (yra). „NoneType“ tikriausiai grąžina lygybės ID. Kadangi Nė vienas yra vienintelis pavyzdys, kurį galite padaryti iš „NoneType“ (manau, kad tai tiesa), abi operacijos yra tos pačios. Kitų tipų atveju tai ne visada. Pavyzdžiui:

 list1 = [1, 2, 3] list2 = [1, 2, 3] if list1==list2: print "Equal" if list1 is list2: print "Same" 

Tai atspausdins „Equal“, nes sąrašuose yra lyginimo operacija, kuri nėra numatytojo tapatybės grąžinimas.

4
25 авг. Atsakymas, kurį pateikė Stephen Pellicer 25 rug. 2008-08-25 22:04 '08 10:04 val. 2008-08-25 22:04

Baigdamas Johną Machiną, „ None yra vienintelis, ar šis kodas patvirtina išvadą.

 >>> x = None >>> y = None >>> x == y True >>> x is y True >>> 

Kadangi None nė vieno, x == None ir x is None bus tas pats rezultatas. Tačiau, mano estetinėje nuomonėje, x == None .

1
27 марта '11 в 22:31 2011-03-27 22:31 atsakymą pateikė „ ncmathsadist“ kovo 27 d. 11 val. 22:31 2011-03-27 22:31

Papildoma informacija:

  • Faktinė išlyga tikrina, ar du object toje pačioje atmintyje. tai yra, jie abu nurodo tą pačią atmintį ir tą patį id .

  • Dėl to 1 užtikrina, kad dviem leksiškai reprezentuotais object yra tie patys atributai (atributai-atributai ...) arba ne

  • Primityvių tipų, pvz., „ bool , „ int , „ string (su kai kuriomis išimtimis), „ NoneType turinčios tą pačią vertę, NoneType visada bus toje pačioje atminties ląstelėje.

Pavyzdžiui.

 >>> int(1) is int(1) True >>> str("abcd") is str("abcd") True >>> bool(1) is bool(2) True >>> bool(0) is bool(0) True >>> bool(0) False >>> bool(1) True 

Ir kadangi „ NoneType “ „Python“ paieškos lentelėje gali būti tik vienas egzempliorius, todėl pirmasis ir paskutinis, greičiausiai, yra programuotojo, kuris parašė kodą (galbūt dėl ​​nuoseklumo), stiliaus ir tada turi bet kokį subtilų logišką pagrindą pasirinkti vieną.

1
19 мая '13 в 18:08 2013-05-19 18:08 atsakymas pateikiamas „ Kraujavimų pirštai“ gegužės 19 d., 13 val. 18:08 2013-05-19 18:08

Kiti klausimai apie „ žymę arba „ Užduoti klausimą“