2016-03-11 2 views
0

Я довольно новичок в python. И у меня есть вопрос.Как правильно использовать 'is' в python

def set_man(self, new_pos): 
    if new_pos is 'left' or 'right' or 'boat': 
     self.man = new_pos 
     return True 
    else: 
     return False 

будет ли это работать? Или мне нужно вызвать if new_pos для каждого или?

+4

Нет. Попробуйте 'if new_pos in ('left', 'right', 'boat'):'. –

+0

Ничего себе, спасибо. Это было довольно быстро! –

+1

Это не сработает по двум причинам. Один будет отображаться людьми с лучшими навыками обмана, чем я. Другой - это тесты 'is', чтобы увидеть, является ли один объект тем же объектом, что и другой. То есть, он дает «True» только в том случае, если у них одинаковое место в памяти. Однако вы хотите увидеть, эквивалентны ли они. Do 'if new_pos in (« left »,« right »,« boat »):' – zondo

ответ

4
воли

эту работу?

нет, это не будет, потому что вы написали на самом деле:

  • new_pos is "left"id(new_pos) == id("left") → логическое значение X
  • 'right' покое → bool('right') → всегда True
  • 'boat' одна → bool('boat') → всегда True

при оценке этого выражения вы получаете: X or True or True который всегда оценивает True. Таким образом, независимо от того, new_pos - ваша функция, будет всегда return True и назначить new_pos на self.man.

Или мне нужно позвонить, если new_pos для каждого или?

хорошо, что это способ сделать это:

if new_pos is 'left' or new_pos is 'right' or new_pos is 'boat': 

, но это немного многословный, и не очень элегантно. Лучший способ записать его, чтобы спросить, есть ли new_pos в кортеже ('left', 'right', 'boat'):

if new_pos in ('left', 'right', 'boat'): 

Nota Bene: хотя я предпочитаю использовать is при работе со строками (как это часто делает прекрасные предложения, как if user_input is "yes" , иметь в виду, что это исключительное поведение оператора is.

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

Именно поэтому оператор is называется оператором идентификации, а оператором == является оператор equality. Учитывая, что оператор id() дает уникальный идентификатор для экземпляра: вы можете перевести a is b в id(a) == id(b). Побольше читайте об этом this QA.

+0

Я не думаю, что добавление 'is not None' к проверкам' right' и 'boat' подходит. Пустые строки и контейнеры и нулевые значения различных числовых типов также «ложны» в Python, а не только «Нет». Может быть, использовать 'bool ('left')' вместо '' left 'is not None'? – Blckknght

+0

О, я написал только смысл на полном английском, а не на питоне. Вот почему я использовал backticks! Но вы правы, позвольте мне подробно остановиться на том, что действительно делается. – zmo

+0

отредактирован, надеюсь, вам понравится это лучше ☺ – zmo

0

Если вы хотите узнать тему см this thread

Если вы просто хотите, чтобы ваш код работал, как он есть, использовать его так:

def set_man(self, new_pos): 
    if new_pos is 'left' or new_pos is 'right' or new_pos is 'boat': 
     self.man = new_pos 
     return True 
    else: 
     return False 
Смежные вопросы