"Foo'dur Yok" ve "foo == Yok" arasında herhangi bir fark var mı?

oy
207

herhangi bir fark arasındaki var mıdır:

if foo is None: pass

ve

if foo == None: pass

Ben en çok Python kodu (ve kendimi yazma kodu) gördüğüm kongre eski, ama son zamanlarda ikincisi kullandığı kod karşılaştım. Doğru, Yok bir örnek (ve sadece örnek IIRC) NoneType ait, bu nedenle önemli olmamalı? herhangi hangi koşullar altında olabilir var mı?

Oluştur 25/08/2008 saat 17:27
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
239

isher döner Trueaynı nesne örneği karşılaştırır eğer

Oysa ==sonunda belirlenir __eq__()yöntemi

yani


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

>>> f = Foo()
>>> f == None
True
>>> f is None
False
Cevap 25/08/2008 saat 17:38
kaynak kullanıcı

oy
47

Bunu okumak isteyebilirsiniz nesne kimliği ve eşdeğerlik .

nesneleri aynı örneği (bellekte aynı adresi) bakınız, nesne kimliği için kullanılan 'bir' ifadesi, bu kontrol eder.

Ve '==' ifadesi eşitlik (aynı değerde) ifade eder.

Cevap 25/08/2008 saat 17:48
kaynak kullanıcı

oy
4

Hiçbiri için eşitlik (==) ve kimlik (olan) arasında bir fark olmamalıdır. NoneType muhtemelen eşitlik için kimliğini döndürür. Hiçbiri NoneType yapmak tek örneği (bu doğrudur düşünüyorum) olduğundan, iki operasyon aynıdır. diğer türleri söz konusu olduğunda bu her zaman böyle değildir. Örneğin:

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

listeleri kimlik dönen varsayılan olmayan bir karşılaştırma işlemi sahip olduğu için bu "Eşit" basacaktır.

Cevap 25/08/2008 saat 18:04
kaynak kullanıcı

oy
4

@ Jason :

Ben çizgisinde bir şey daha kullanılması önerilir

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

Ben kullanarak sevmiyorum "ise foo:" foo gerçekten bir boolean değeri temsil sürece (yani 0 veya 1). foo bir dize veya bir nesne veya başka bir şey ise "foo eğer:" işe yarayabilir, ama bana tembel bir kısayol gibi görünüyor. x Yok olup olmadığını görmek için kontrol ediyoruz "x Yok eğer:" derler.

Cevap 25/08/2008 saat 20:35
kaynak kullanıcı

oy
24

Uyarı kelimesi:

if foo:
  # do something

değil tam olarak aynı:

if x is not None:
  # do something

Eski bir mantıksal değerdir testidir ve farklı bağlamlarda false değerlendirebilir. örnek boş konteynerlerin, boolean değerler için bir mantıksal değerdir testlerinde yanlış temsil şeylerin vardır. Yok da bu durumda yanlış olarak değerlendirir ama başka şeyler de yapmak.

Cevap 26/08/2008 saat 12:44
kaynak kullanıcı

oy
12

(ob1 is ob2) eşittir (id(ob1) == id(ob2))

Cevap 25/02/2009 saat 09:34
kaynak kullanıcı

oy
11

Nedeni foo is NoneTercih yolu kendi tanımlayan bir nesneyi ele olabileceğini olduğunu __eq__ve bu Hiçbiri eşit olacak şekilde nesneyi tanımlar. Yani, her zaman kullanmak foo is Nonebunu infact olup olmadığını görmek için gerekirse None.

Cevap 28/05/2010 saat 20:15
kaynak kullanıcı

oy
1

John Machin vardığı sonuç Nonebir tekil olan bu kodun tarafından takviye bir sonuçtur.

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

Yana Nonebir tekil olduğunu x == Noneve x is Noneaynı sonuca ulaşılır. Ancak, benim estetik görüşüne göre, x == Noneen iyisidir.

Cevap 27/03/2011 saat 18:31
kaynak kullanıcı

oy
2

Biraz daha ayrıntıları:

  1. isİki eğer hüküm aslında denetler objectler aynı hafıza yerinde veya değil. aynı bellek konumuna onlar olsun hem noktada yani aynı olması id.

  2. 1 bir sonucu olarak, isiki lexically temsil olsun, ya da olmasın sağlar objects aynı özelliklerini (nitelikler-of-leriyle ...) ya da olmasın

  3. Gibi temel türlerin Destekleme bool, int, string(bazı hariç), NoneTypebir aynı değere sahip olan, her zaman aynı belleğe olur.

Örneğin

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

Beri NoneTypesadece Python yönettiği "look-up" tablosunda kendisinin bir örneği olabilir bu nedenle eski ve ikinci ziyade herhangi ince mantıklı sebep olan (belki tutarlılık için) kod yazdım geliştirici bir programlama tarzı daha vardır diğeri üzerinde birini seçin.

Cevap 19/05/2013 saat 14:08
kaynak kullanıcı

oy
8

Elbette aynı olacak olan nesneler eşit için hiçbir fark yoktur. Ancak, PEP 8 açıkça kullanmalısınız devletler is:

Asla eşitlik operatörleri ya değildir ile None gibi tekiz Karşılaştırmalar her zaman yapılmalıdır.

Cevap 19/05/2013 saat 14:35
kaynak kullanıcı

oy
5

iskimlik için testler değil eşitlik. Ekstrenizdeki için foo is none, Python basitçe nesnelerin bellek adresini karşılaştırır. Bu soruyu soruyorsunuz demektir "Aynı nesne için iki isim var mı?"

==Eşitlik diğer yandan testleri ile tespit edildiği üzere __eq__()bir yöntem. Bu kimlik umurunda değil.

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

NoneBir tek operatörüdür. Yani None is Noneher zaman doğrudur.

In [101]: None is None
Out[101]: True
Cevap 19/12/2014 saat 02:05
kaynak kullanıcı

oy
0
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
Cevap 03/04/2019 saat 06:11
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more