learn - python online



C'è qualche differenza tra "foo is None" e "foo== None"? (8)

@ Jason :

Raccomando di usare qualcosa di più sulla falsariga di

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

Non mi piace usare "if foo:" a meno che foo rappresenti veramente un valore booleano (cioè 0 o 1). Se foo è una stringa o un oggetto o qualcos'altro, "if foo:" può funzionare, ma mi sembra una scorciatoia pigra. Se stai controllando se x è None, dì "se x è None:".

https://src-bin.com

C'è qualche differenza tra:

if foo is None: pass

e

if foo == None: pass

La convenzione che ho visto nella maggior parte del codice Python (e il codice che io stesso scrivo) è la prima, ma di recente ho trovato il codice che usa quest'ultima. None è un'istanza (e l'unica istanza, IIRC) di NoneType, quindi non dovrebbe avere importanza, giusto? Ci sono circostanze in cui potrebbe essere?


Answer #1

Alcuni ulteriori dettagli:

  1. La clausola is realtà controlla se i due object trovano nella stessa posizione di memoria o meno. cioè se entrambi puntano alla stessa posizione di memoria e hanno lo stesso id .

  2. Come conseguenza di 1, is accerta se, o meno, i due object rappresentati in modo lessicale abbiano attributi identici (attributi-degli-attributi ...) o no

  3. L'istanziazione di tipi primitivi come bool , int , string (con qualche eccezione), NoneType con lo stesso valore sarà sempre nella stessa posizione di memoria.

Per esempio

>>> 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

E poiché NoneType può avere una sola istanza di se stessa nella tabella di "look-up" di Python, quindi la prima e la seconda sono più di uno stile di programmazione dello sviluppatore che ha scritto il codice (forse per coerenza) piuttosto che avere una ragione logica sottile scegliere l'uno rispetto all'altro.


Answer #2

La conclusione di John Machin secondo cui None è un singleton è una conclusione sostenuta da questo codice.

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

Poiché None è un singleton, x == None e x is None avranno lo stesso risultato. Tuttavia, nel mio parere estetico, x == None è il migliore.


Answer #3

Non c'è differenza perché gli oggetti identici saranno ovviamente uguali. Tuttavia, PEP 8 afferma chiaramente che dovresti usare is :

I confronti con singleton come None dovrebbero sempre essere fatti con is o is, mai gli operatori di uguaglianza.


Answer #4

Potresti voler leggere questa identità dell'oggetto e l'equivalenza .

L'istruzione 'is' è usata per l'identità dell'oggetto, controlla se gli oggetti si riferiscono alla stessa istanza (stesso indirizzo in memoria).

E la frase '==' si riferisce all'uguaglianza (stesso valore).


Answer #5

Una parola di cautela:

if foo:
  # do something

Non è esattamente la stessa di:

if x is not None:
  # do something

Il primo è un test di valore booleano e può essere valutato come falso in diversi contesti. Ci sono un numero di cose che rappresentano false in un test di valori booleani, ad esempio contenitori vuoti, valori booleani. Nessuno giudica falso anche in questa situazione, ma anche altre cose.


Answer #6

is sempre restituisce True se confronta la stessa istanza dell'oggetto

Mentre == è in definitiva determinato dal metodo __eq__()

vale a dire


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False

Answer #7

is test per l'identità, non l' uguaglianza. Per la tua istruzione foo is none , Python confronta semplicemente l'indirizzo di memoria degli oggetti. Significa che stai facendo la domanda "Ho due nomi per lo stesso oggetto?"

== d'altra parte prova per l'uguaglianza come determinato dal metodo __eq__() . Non importa dell'identità.

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 è un operatore singleton. Quindi None is None è sempre vero.

In [101]: None is None
Out[101]: True




python