2012-04-18 15 views

risposta

9
>>> a = [[]] 
>>> b = [] 
>>> b in a 
True 
>>> b is a[0] 
False 

Ciò dimostra che si tratta di un controllo del valore (predefinito per impostazione predefinita), non di un controllo di identità. Tieni presente che una classe può, se lo desideri, ignorare lo __contains__() per renderlo un controllo di identità. Ma di nuovo, per impostazione predefinita, no.

+0

Questo è perfetto grazie! –

1

Dipende dalla classe come funziona il controllo. Per l'integrato list utilizza l'operatore ==; altrimenti non potresti, ad es. utilizzare 'something' in somelist in modo sicuro.

Per essere più specifici, controlla se l'articolo è uguale a un elemento nell'elenco, quindi internamente è più probabile un confronto con hash(a) == hash(b); se gli hash sono uguali, anche gli oggetti stessi sono probabilmente paragonati.

+1

Non sarà solo un controllo di hash: gli hash possono essere uguali senza che i valori siano uguali. –

+0

Grazie ragazzi che è un'informazione molto utile! –

+0

Questo è sbagliato. Ho appena definito un metodo '__eq__' che è stato (involontariamente) raccolto da' __contains__' o 'in'. Pertanto, è molto probabile che 'list' implementa un confronto' a .__ eq __ (b) '. – Atcold

Problemi correlati