У меня есть программа на Python, где две переменные установлены в значение 'public'
. В условном выражении у меня есть сравнение, var1 is var2
которое не удается, но если я изменяю его, var1 == var2
оно возвращает True
.
Теперь, если я открою свой интерпретатор Python и проведу такое же сравнение «как есть», это будет успешно.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Что мне здесь не хватает?
input = raw_input("Decide (y/n): ")
. В этом случае вход «y» иif input == 'y':
вернет «True», в то время какif input is 'y':
вернет False.Ответы:
is
это тестирование личности,==
это проверка на равенство. то, что происходит в вашем коде, будет эмулироваться в интерпретаторе следующим образом:так что неудивительно, что они не одинаковы, верно?
Другими словами:
is
этоid(a) == id(b)
источник
==
против.equals()
Java. Самое приятное, что Python==
не аналогичен Java==
.None
значение. Так что у него всегда один и тот же идентификатор.Другие ответы здесь верны:
is
используется для сравнения идентичности , а==
для сравнения на равенство . Поскольку вас волнует равенство (две строки должны содержать одинаковые символы), в этом случаеis
оператор просто неверен, и вы должны использовать==
вместо него.is
Интерактивная причина заключается в том, что (большинство) строковых литералов интернированы по умолчанию. Из Википедии:Таким образом, если в вашей программе есть два строковых литерала (слова, которые буквально набираются в исходный код вашей программы, заключенные в кавычки), которые имеют одинаковое значение, компилятор Python автоматически интернирует строки, делая их оба хранящимися в одном и том же место в памяти. (Обратите внимание, что это не всегда происходит, и правила, когда это происходит, довольно запутаны, поэтому, пожалуйста, не полагайтесь на это поведение в рабочем коде!)
Поскольку в вашем интерактивном сеансе обе строки на самом деле хранятся в одной и той же ячейке памяти, они имеют одинаковую идентичность , поэтому
is
оператор работает, как и ожидалось. Но если вы строите строку каким-либо другим методом (даже если эта строка содержит точно такие же символы), тогда строка может быть одинаковой , но это не та же строка, то есть она имеет другую идентичность , потому что она хранится в другом месте в памяти.источник
==
иis
на основе того, какую проверку вы хотите. Если вы заботитесь о том, чтобы строки были одинаковыми (то есть имели одинаковое содержимое), вам всегда следует использовать==
. Если вы заботитесь о том, относятся ли любые два имени Python к одному и тому же экземпляру объекта, вы должны использоватьis
. Вам может понадобиться,is
если вы пишете код, который обрабатывает множество различных значений, не заботясь об их содержимом, или если вы знаете, что есть только одно из чего-то, и хотите игнорировать другие объекты, притворяющиеся этим. Если вы не уверены, всегда выбирайте==
.is
Ключевое слово тест идентичности объекта при==
сравнение значения.Если вы используете
is
, результат будет истинным, если и только если объект является тем же объектом. Тем не менее,==
будет истина всякий раз, когда значения объекта совпадают.источник
И последнее, что следует отметить, вы можете использовать
sys.intern
функцию, чтобы убедиться, что вы получаете ссылку на ту же строку:Как указано выше, вы не должны использовать
is
для определения равенства строк. Но это может быть полезно знать, если у вас есть какое-то странное требование использоватьis
.Обратите внимание, что
intern
функция была встроенной в Python 2, но была перенесена вsys
модуль в Python 3.источник
is
это проверка идентичности,==
это проверка на равенство. Это означает, чтоis
это способ проверить, являются ли две вещи одинаковыми или просто эквивалентными.Скажем, у вас есть простой
person
объект. Если его зовут Джек и ему 23 года, это эквивалентно другому 23-летнему Джеку, но это не тот же человек.Они одного возраста, но это не один и тот же человек. Строка может быть эквивалентна другой, но это не тот же объект.
источник
jack1.age = 99
, это не изменитсяjack2.age
. Это потому, что это два разных экземпляраjack1 is not jack2
. Однако они могут сравняться друг с другом,jack1 == jack2
если их имя и возраст совпадают. Это становится более сложным для строк, потому что строки неизменны в Python, и Python часто использует один и тот же экземпляр. Мне нравится это объяснение, потому что оно использует простые случаи (обычный объект), а не специальные случаи (строки).Это примечание, но в идиоматическом питоне вы часто увидите такие вещи, как:
Это безопасно, потому что гарантированно будет один экземпляр Null Object (т. Е. None) .
источник
Если вы не уверены, что делаете, используйте «==». Если у вас есть немного больше знаний об этом, вы можете использовать «is» для известных объектов, таких как «None».
В противном случае вы будете удивляться, почему что-то не работает и почему это происходит:
Я даже не уверен, что некоторые вещи будут оставаться одинаковыми между различными версиями / реализациями Python.
источник
Из моего ограниченного опыта работы с python,
is
используется для сравнения двух объектов, чтобы увидеть, являются ли они одним и тем же объектом, в отличие от двух разных объектов с одинаковым значением.==
используется для определения идентичности значенийВот хороший пример:
s1
является строкой Unicode иs2
является нормальной строкой. Они не одного типа, но имеют одинаковое значение.источник
Я думаю, что это связано с тем фактом, что когда сравнение «is» оценивается как ложное, используются два разных объекта. Если он оценивается как true, это означает, что внутри он использует один и тот же точный объект и не создает новый, возможно, потому, что вы создали их в течение доли или около того секунд, и потому что между оптимизацией и оптимизацией нет большого промежутка времени. использует тот же объект.
Вот почему вы должны использовать оператор равенства
==
,is
чтобы сравнивать значение строкового объекта.В этом примере я сделал s2, который был другим строковым объектом, ранее равным 'one', но это не тот же объект
s
, что и потому, что интерпретатор не использовал тот же объект, поскольку я изначально не назначал его 'one', если бы у меня это было, они бы сделали один и тот же объект.источник
.replace()
в качестве примера в этом контексте, вероятно, не самое лучшее, потому что его семантика может сбивать с толку. всегдаs2 = s2.replace()
будет создавать новый строковый объект, назначать новый строковый объект , а затем избавляться от строкового объекта, который использовался для указания. Таким образом, даже если бы вы это сделали, вы все равно получили бы новый строковый объект.s2
s2
s = s.replace('one', 'one')
Я считаю, что это известно как "интернированные" строки. Это делает и Python, и Java, и C и C ++ при компиляции в оптимизированных режимах.
Если вы используете две одинаковые строки вместо того, чтобы тратить память на создание двух строковых объектов, все интернированные строки с одинаковым содержимым указывают на одну и ту же память.
Это приводит к тому, что оператор Python «is» возвращает True, потому что две строки с одинаковым содержимым указывают на один и тот же строковый объект. Это также произойдет в Java и C.
Это полезно только для экономии памяти. Вы не можете полагаться на него для проверки на равенство строк, потому что различные интерпретаторы и компиляторы и механизмы JIT не всегда могут это сделать.
источник
Я отвечаю на вопрос, несмотря на то, что вопрос старый, потому что ни один ответ не цитирует ссылку на язык
На самом деле оператор is проверяет идентичность, а оператор == проверяет равенство,
Из справочника языка:
Типы влияют практически на все аспекты поведения объекта. Даже важность идентичности объекта зависит в некотором смысле: для неизменяемых типов операции, которые вычисляют новые значения, могут фактически возвращать ссылку на любой существующий объект с тем же типом и значением, в то время как для изменяемых объектов это недопустимо. . Например, после а = 1; b = 1, a и b могут или не могут ссылаться на один и тот же объект со значением один, в зависимости от реализации, но после c = []; d = [], c и d гарантированно ссылаются на два разных, уникальных, недавно созданных пустых списка. (Обратите внимание, что c = d = [] назначает один и тот же объект как c, так и d.)
Таким образом, из приведенного выше утверждения мы можем сделать вывод, что строки, которые являются неизменяемым типом, могут завершаться с ошибкой при проверке с помощью «is» и могут быть проверены успешно при проверке с помощью «is»
То же самое относится к int, кортежу, которые также являются неизменяемыми типами.
источник
==
Тестовое значение оператора эквивалентности.is
Идентичность тесты оператора объекта, тесты Python ли два действительно тот же объект (то есть, жить по тому же адресу в памяти).В этом примере Python создал только один строковый объект, и оба,
a
иb
ссылаются на него. Причина в том, что Python внутренне кэширует и повторно использует некоторые строки в качестве оптимизации, на самом деле в памяти есть просто строка «банан», совместно используемая a и b; Чтобы вызвать нормальное поведение, вам нужно использовать более длинные строки:Когда вы создаете два списка, вы получаете два объекта:
В этом случае мы бы сказали, что два списка эквивалентны, потому что они имеют одинаковые элементы, но не идентичны, потому что они не являются одним и тем же объектом. Если два объекта идентичны, они также эквивалентны, но если они эквивалентны, они не обязательно идентичны.
Если
a
ссылается на объект, и вы назначаетеb = a
, то обе переменные ссылаются на один и тот же объект:источник
is
будет сравнивать расположение памяти. Используется для сравнения на уровне объекта.==
будет сравнивать переменные в программе. Используется для проверки на уровне значения.is
проверяет эквивалентность на уровне адресов==
проверяет эквивалентность на уровне значенийисточник
is
тестирование идентичности, тестирование на==
равенство (см. документацию Python ).В большинстве случаев, если
a is b
, тогдаa == b
. Но есть исключения, например:Таким образом, вы можете использовать только
is
для тестов идентичности, но не тесты на равенство.источник