Сведения о вопросе

Killer

22:35, 27th August, 2020

Теги

python    

Есть ли разница между "foo is None" и "foo = = None"?

Просмотров: 663   Ответов: 12

Есть ли какая-то разница между ними:

if foo is None: pass

и

if foo == None: pass

Соглашение, которое я видел в большинстве Python кода (и кода, который я сам пишу) является первым, но я недавно наткнулся на код, который использует последнее. Никто не является экземпляром (и единственным экземпляром, IIRC) из NoneType, так что это не должно иметь значения, верно? Есть ли какие-то обстоятельства, при которых это могло бы произойти?



  Сведения об ответе

LAST

05:29, 16th August, 2020

is всегда возвращает True , если он сравнивает один и тот же экземпляр объекта

Тогда как == в конечном счете определяется методом __eq__()

т.е.


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

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


  Сведения об ответе

nYU

00:33, 23rd August, 2020

Возможно, вы захотите прочитать этот объект идентичности и эквивалентности .

Оператор 'is' используется для идентификации объекта, он проверяет, ссылаются ли объекты на один и тот же экземпляр (один и тот же адрес в памяти).

А утверждение '= = ' относится к равенству (одинаковому значению).


  Сведения об ответе

DAAA

09:18, 3rd August, 2020

Одно слово предостережения:

if foo:
  # do something

Это не совсем то же самое, что:

if x is not None:
  # do something

Первый является тестом булевых значений и может быть оценен как false в различных контекстах. Существует ряд вещей, которые представляют false в логическом значении, например, пустые контейнеры, логические значения. Никто также не оценивает ложь в этой ситуации, но и другие вещи тоже делают это.


  Сведения об ответе

VERSUION

03:51, 8th August, 2020

Причина , по которой foo is None является предпочтительным способом, заключается в том, что вы можете обрабатывать объект, который определяет свой собственный __eq__, и который определяет объект, равный None. Поэтому всегда используйте foo is None , если вам нужно увидеть, является ли он infact None .


  Сведения об ответе

PHPH

23:11, 3rd August, 2020

(ob1 is ob2) равно (id(ob1) == id(ob2))


  Сведения об ответе

DAAA

14:48, 15th August, 2020

Нет никакой разницы, потому что объекты, которые идентичны, конечно, будут равны. Однако PEP 8 ясно указывает, что вы должны использовать is :

Сравнения с синглетонами типа None всегда должны выполняться с помощью is или is not, а не операторов равенства.


  Сведения об ответе

DINO

16:24, 19th August, 2020

is тесты на идентичность, а не на равенство. Для вашего утверждения foo is none, Python просто сравнивает адрес памяти объектов. Это значит, что вы задаете вопрос "Do I have two names for the same object?"

== с другой стороны, тесты на равенство, определенные методом __eq__() . Он не заботится об идентичности.

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 - это оператор singleton. Так что None is None -это всегда правда.

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


  Сведения об ответе

PIRLO

22:42, 27th August, 2020

@ Джейсон :

Я рекомендую использовать что-то большее по линии

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

Я не люблю использовать "if foo:", если foo действительно не представляет логическое значение (т. е. 0 или 1). Если foo-это строка, объект или что-то еще, "if foo:" может работать, но для меня это выглядит как ленивый ярлык. Если вы проверяете, нет ли x, скажите "if x is None:".


  Сведения об ответе

screen

06:10, 13th August, 2020

Ни для кого не должно быть разницы между равенством ( = = ) и идентичностью (есть). NoneType, вероятно, возвращает идентичность для равенства. Поскольку ни один из них не является единственным экземпляром, который вы можете сделать из NoneType (я думаю, что это правда), эти две операции одинаковы. В случае других типов это не всегда так. Например:

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

Это привело бы к печати "Equal", так как списки имеют операцию сравнения, которая не является возвращением идентификатора по умолчанию.


  Сведения об ответе

KOMP

20:58, 17th August, 2020

Еще несколько деталей:

  1. Предложение is фактически проверяет, являются ли два object s одинаковыми место в памяти или нет. то есть указывают ли они оба на одно и то же расположение в памяти и имеют тот же id .

  2. Как следствие 1, is гарантирует, имеют ли два лексически представленных object s идентичные атрибуты (attributes-of-attributes...) или нет

  3. Экземпляры примитивных типов , таких как bool , int, string (за некоторым исключением), NoneType , имеющие одно и то же значение, всегда будут находиться в одной и той же ячейке памяти.

E.g.

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

И так как NoneType может иметь только один экземпляр самого себя в таблице "look-up" python, то первый и второй являются скорее стилем программирования разработчика, который написал код(возможно, для согласованности), а не имеет какой-либо тонкой логической причины выбирать один из них вместо другого.


  Сведения об ответе

piter

05:02, 23rd August, 2020

Вывод Джона Мэчина о том, что None -это singleton, подкрепляется этим кодом.

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

Поскольку None - это singleton, то x == None и x is None будут иметь один и тот же результат. Однако, по моему эстетическому мнению, x == None лучше всего.


  Сведения об ответе

FAriza

05:07, 23rd August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться