2013-03-27 35 views
8
Variable = None 

Czy jest jakaś różnica między tymi trzema w konkretnym scenariuszu? jeśli nie ma różnicy, która z nich jest bardziej odpowiednia do użycia?"zmienna" lub "zmienna nie jest żadna"

if Variable: 
print "Hello world" 

i

if Variable is not None: 
print "Hello world" 

i

if Variable != None: 
print "Hello world" 

są takie same w przypadku brak zmienne?

+0

Może on pomieszane 'jeśli x jest None' i' jeśli x == None' – jamylak

+0

tak, dobrze. Dzięki za przypomnienie –

+0

To powinno być zamknięte, to nie jest prawdziwe pytanie ani duplikat. http: // stackoverflow.com/questions/3257919/is-none-vs-none http://stackoverflow.com/questions/7816363/if-a-vs-if-a-is-not-none – jamylak

Odpowiedz

8

Czy jest jakaś różnica między tymi trzema w konkretnym scenariuszu?

Pierwszy pyta, czy zmienna jest cokolwiek niesprawna. Ten test nie powiedzie się dla wszystkich rodzajów rzeczy oprócz None - False, 0 każdy pusty sekwencji itp

Drugi pyta czy to magia stała None Singleton. To się nie uda tylko dla samej None.

Trzeci pyta, czy jest to coś, co uważa się za równe None. Nie powiedzie się, na przykład, Holder(None), gdzie Holder jest klasą opakowania, której porównania instancji są równe temu, co trzymają. Lub, aby dać mniej realistyczny, ale krótszy do kodu exmaple:

class Stupid(object): 
    def __ne__(self, other): 
     return False 
Variable = Stupid() 

Ten ostatni rzadko jest przydatny; w rzeczywistości, jeśli kiedykolwiek pomyślisz, że powinieneś sprawdzić == None lub != None, a nie tworzysz przezroczystych klas ani niczego w tym stylu, prawdopodobnie chciałeś is None lub is not None. Ale pozostałe dwa są bardzo użyteczne i powszechne.

jeśli nie ma różnicy, który z nich jest bardziej odpowiedni do użycia?

Cóż, jest różnica, i który z nich jest bardziej odpowiedni, zależy od konkretnego zastosowania.

Pod koniec pytania wydaje się, że możesz zapytać, czy jest jakaś różnica w konkretnym przypadku, gdzie Variable jest zdecydowanie None. W tym przypadku oczywiście nie ma żadnej różnicy funkcjonalnej między tymi trzema. * Wszystkie z nich są gwarantowane jako fałszywe, a zatem nic nie robią. Co oznacza, że ​​nie ma również żadnej różnicy między żadną z tych trzech a pisaniem żadnego kodu. Co jest dużo prostsze, bardziej czytelne i szybsze.

* Występuje różnica w wydajności - pierwsza z nich nie musi być LOAD_CONST z None ani wywoływać operatora porównania. I nawet, jeśli udało Ci się jakoś ponownie ustalić None lub zmienić wartość stałej None (być może poprzez deptanie całej sterty za pomocą ctypes?), Pierwsza z nich prawdopodobnie jeszcze zadziała. Ale żaden z nich nigdy nie będzie miał znaczenia - a jeśli tak, to znowu żaden kod nie będzie jeszcze szybszy i bardziej niezawodny.

6

not x będzie prawdziwa, jeśli x jest None, False, [], {} itp

x is not None zawsze będzie True, chyba że zmienna jest faktycznie None.

Edit:

Ma to znaczenie praktyczne, gdy chcesz sprawdzić, czy zmienna jest ustawiana na właściwą wartość. W przeciwnym razie możesz napotkać problemy. Na przykład, jeśli chcesz ocenić listę elementów i zrobić:

if not x: 

aby sprawdzić, czy lista została pod warunkiem, wówczas stan wywoła na pustej liście, które nadal mogą być poprawnym wejściowego. Więc w tym przypadku, chcesz sprawdzić z

if x is not None: 

aby umożliwić pustych list jako ważny wkład, ale nadal sprawdzać sprawę, że żadna lista w ogóle była mowa.

Wartość None jako taka jest porównywalna z wartością null lub nil w niektórych językach. Jest to symbol zastępczy dla braku wartości w zdefiniowanej zmiennej (jeśli jest niezdefiniowany, rzuci NameError). Dlatego wartość None jest używana jako wartość domyślną w niektórych przypadkach:

>>> def foo(): 
...  pass 
... 
>>> x = foo() 
>>> x is None 
True 

Jest również często wykorzystywane jako wartość domyślna dla zmiennych Opcjonalnie:

>>> def foo(bar=None): 
...  if bar is None: 
...   print('No argument passed.') 
...  else: 
...   print('Variable bar: %s' % str(bar)) 
... 
>>> foo(0) 
Variable bar: 0 
>>> foo() 
No argument passed. 

ten sposób 0 jest nadal ważna wartość , który byłby oceniany na False, jeśli jest zaznaczony z if not bar:.

+0

Sformułowanie nitpick: Jeśli zmienna nie jest zdefiniowana, 'if x is not Brak' jest nadal' NameError', podobnie jak 'if not x'. (Możesz chcieć opisać pewien rodzaj default- do -None', aby ułatwić wyjaśnienie tego w prosty sposób, nie wprowadzając w błąd?) – abarnert

+0

Dzięki, edytowaliście odpowiedź. –

1

Są różne. not sprawdza, czy bool(var) ocenia na False.

np.

>>> not '' 
True 
>>> not 'abc' 
False 
>>> not 0 
True 

if x is None sprawdza czy x jest sama None.

3

official PEP 8 recommendation jest test dla Żaden z kontroli tożsamości:

if Variable is not None: 
    print "Hello world" 

Test równości/nierówności będzie również działać, ale będzie wolniejszy i non-idiomatyczne:

if Variable != None: 
    print "Hello world" 

Testowanie wartość boolowska zmiennej zmienna daje inny wynik. Poniższy test pozwoli wydrukować „Hello World”, jeśli zmienna była pusty pojemnik lub numer równy zeru:

# Hello world won't print for any of these values: 
for Variable in(), '', u'', {}, [], 0, 0.0, 0j, None: 
    if Variable: 
     print "Hello world"