2012-04-18 20 views

Odpowiedz

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

Dowodzi to, że jest to sprawdzanie wartości (domyślnie przynajmniej), a nie kontrola tożsamości. Należy jednak pamiętać, że klasa może w razie potrzeby zastąpić __contains__(), aby sprawdziła tożsamość. Ale znowu domyślnie nie.

+0

To jest idealne dzięki! –

1

To zależy od klasy, w jaki sposób sprawdza. Dla wbudowanego list używa operatora ==; inaczej nie moglibyście np. bezpiecznie korzystaj z 'something' in somelist.

Aby być bardziej szczegółowym, sprawdza, czy element jest równy pozycji na liście - tak wewnętrznie najprawdopodobniej jest to porównanie hash(a) == hash(b); jeśli skróty są równe, to same obiekty są prawdopodobnie również porównywane.

+1

To nie będzie tylko sprawdzanie skrótów - wartości skrótów mogą być równe bez wartości równych. –

+0

Dzięki chłopaki, to bardzo pomocne informacje! –

+0

To jest złe. Właśnie zdefiniowałem metodę "__eq__", która została (nieumyślnie) pobrana przez '__contains__' lub' in'. Dlatego najprawdopodobniej 'list' implementuje porównanie' a .__ eq __ (b) '. – Atcold

Powiązane problemy