Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1726
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Есть ли разница между "foo is None" и "foo = = None"?
Есть ли какая-то разница между ними:
if foo is None: pass
и
if foo == None: pass
Соглашение, которое я видел в большинстве Python кода (и кода, который я сам пишу) является первым, но я недавно наткнулся на код, который использует последнее. Никто не является экземпляром (и единственным экземпляром, IIRC) из NoneType, так что это не должно иметь значения, верно? Есть ли какие-то обстоятельства, при которых это могло бы произойти?
Возможно, вы захотите прочитать этот объект идентичности и эквивалентности .
Оператор 'is' используется для идентификации объекта, он проверяет, ссылаются ли объекты на один и тот же экземпляр (один и тот же адрес в памяти).
А утверждение '= = ' относится к равенству (одинаковому значению).
Одно слово предостережения:
if foo:
# do something
Это не совсем то же самое, что:
if x is not None:
# do something
Первый является тестом булевых значений и может быть оценен как false в различных контекстах. Существует ряд вещей, которые представляют false в логическом значении, например, пустые контейнеры, логические значения. Никто также не оценивает ложь в этой ситуации, но и другие вещи тоже делают это.
Причина , по которой foo is None является предпочтительным способом, заключается в том, что вы можете обрабатывать объект, который определяет свой собственный __eq__, и который определяет объект, равный None. Поэтому всегда используйте foo is None , если вам нужно увидеть, является ли он infact None .
Нет никакой разницы, потому что объекты, которые идентичны, конечно, будут равны. Однако PEP 8 ясно указывает, что вы должны использовать is :
Сравнения с синглетонами типа None всегда должны выполняться с помощью is или is not, а не операторов равенства.
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
@ Джейсон :
Я рекомендую использовать что-то большее по линии
if foo: #foo isn't None else: #foo is None
Я не люблю использовать "if foo:", если foo действительно не представляет логическое значение (т. е. 0 или 1). Если foo-это строка, объект или что-то еще, "if foo:" может работать, но для меня это выглядит как ленивый ярлык. Если вы проверяете, нет ли x, скажите "if x is None:".
Ни для кого не должно быть разницы между равенством ( = = ) и идентичностью (есть). NoneType, вероятно, возвращает идентичность для равенства. Поскольку ни один из них не является единственным экземпляром, который вы можете сделать из NoneType (я думаю, что это правда), эти две операции одинаковы. В случае других типов это не всегда так. Например:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
Это привело бы к печати "Equal", так как списки имеют операцию сравнения, которая не является возвращением идентификатора по умолчанию.
Еще несколько деталей:
Предложение
isфактически проверяет, являются ли дваobjects одинаковыми место в памяти или нет. то есть указывают ли они оба на одно и то же расположение в памяти и имеют тот жеid.Как следствие 1,
isгарантирует, имеют ли два лексически представленныхobjects идентичные атрибуты (attributes-of-attributes...) или нетЭкземпляры примитивных типов , таких как
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, то первый и второй являются скорее стилем программирования разработчика, который написал код(возможно, для согласованности), а не имеет какой-либо тонкой логической причины выбирать один из них вместо другого.