2013-05-17 4 views
6

Ошибочное поведение выражений «is» в python.Как python оценивает выражения «is»?

>>> 258 -1 is 257 
False 

И

>>> 258 -1 == 257 
True 
  1. Как оценивает питон "является" выражение? и почему он показывает это как ложное, хотя это правда?

  2. Почему это происходит только с определенным набором чисел?

    2 - 1 1 Правда

работает прекрасно.

+0

'>>> 2-1 is 1' возвращает' True' lol – TehTris

+0

@carlosdc его не совсем дубликат. Поскольку он работает для других чисел. Вот почему я спросил. – Rahul

+1

@Rahul Измените это в своем вопросе. – askewchan

ответ

2

is сравнивает идентификатор объекта и дает True только в том случае, если обе стороны являются одним и тем же объектом. По соображениям производительности Python поддерживает «кеш» небольших целых чисел и повторно использует их, поэтому все объекты int(1) являются одним и тем же объектом. В CPython кешированные целые числа варьируются от -5 до 255, но это детализация реализации, поэтому вы не должны полагаться на нее. Если вы хотите сравнить равенство, используйте ==, а не is.

+0

Вы также можете получить такие вещи, которые происходят со строками, поскольку строковые литералы кэшируются до определенного размера. И такие вещи, как 'foo =" foo "; foo is foo.strip() 'также может возвращать' True'. – mgilson

1

Python is operator проверяет на наличие идентификатор объекта, а не стоимость объекта. Два целых числа должны ссылаться на один и тот же фактический объект внутри, чтобы возвращать true.

Это вернет true для «малых» целых чисел из-за внутреннего кэша, поддерживаемого Python, но два числа с одинаковым значением не вернут true, если сравнивать с is в целом.

6

is используется для проверки подлинности, чтобы проверить, указывают ли обе переменные на один и тот же объект, , а == используется для проверки значений.

От docs:

Операторы is и is not тест для идентичности объекта: x is y является true тогда и только тогда, когда х и у того же объекта. x is not y дает обратное значение истины .

>>> id(1000-1) == id(999) 
False 

""" What is id? 
id(object) -> integer 
Return the identity of an object. This is guaranteed to be unique among 
simultaneously existing objects. (Hint: it's the object's memory address.) 
""" 

>>> 1000-1 is 999 
False 
>>> 1000-1 == 999 
True 
>>> x = [1] 
>>> y = x #now y and x both point to the same object 
>>> y is x 
True 
>>> id(y) == id(x) 
True 
>>> x = [1] 
>>> y = [1] 
>>> x == y 
True 
>>> x is y 
False 
>>> id(x),id(y)  #different IDs 
(161420364, 161420012) 

Но некоторые небольшие целые числа (-5 256) и небольшие строки в кэш Python: Why (0-6) is -6 = False?

#small strings 
>>> x = "foo" 
>>> y = "foo" 
>>> x is y 
True 
>>> x == y 
True 
#huge string 
>>> x = "foo"*1000 
>>> y = "foo"*1000 
>>> x is y 
False 
>>> x==y 
True 
2

The is проверки оператора идентичности объекта: объект, созданный с помощью вызова 258-1 является НЕ тот же объект, что и созданный 257. Оператор == проверяет, совпадают ли значения сравниваемых объектов.

Пробуйте использовать help('is').

+0

Тогда почему 2-1 1 возвращает True? – Rahul

+0

@Rahul python кэширует небольшие целые числа и маленькие строки, см. Http://stackoverflow.com/questions/11476190/why-0-6-is-6-false –

+0

Ответил здесь: http://stackoverflow.com/a/16615952/2237320 – Alice