2014-02-04 4 views
0

Я пытаюсь сравнить две строки, например. if self.Ends == '101100' or '001101'. self.Ends находится в классе для сравнения двух трехмерных координат. он может содержать 000100. Есть восемь сравнений ifelif.Сравнение строк с == дает неправильное значение?

Программа всегда возвращает 'a', даже self.Ends имеет еще одну строку 01.

if self.Ends == '100101' or '101100': 
    P_line.Line = 'a' 

elif self.Ends == '000100' or '100000': 
    P_line.Line = 'b' 
+0

' «101100» является строкой, отличной от нулевой длины, и, как таковая, всегда верна. Так и '100000''. Поэтому и ваши утверждения 'if' всегда верны. – kindall

+0

Обычно я большой поклонник языковых конструкций, которые читаются как английский, но этот человек слишком много путешествует. –

ответ

5

Вам необходимо сравнить строку self.Ends с обеих сторон or. В противном случае это всегда будет правдой. то есть. if 1: такая же, как if 'a': Они оба будут вычисляться True

if self.Ends == '100101' or self.Ends == '101100': 
     P_line.Line = 'a' 

    elif self.Ends == '000100' or self.Ends == '100000': 
     P_line.Line = 'b' 
+5

Можно также использовать 'if self.Ends in ('100101', '101100'):' – sberry

+0

Да, это более путинский путь. – jramirez

1

@jramirez ответил почему, но это альтернативный подход, чтобы начать с.

Это может быть лучше, чем делать все те if, elif, else

>>> mapper = {'a': ('100101', '101100'), 'b': ('000100', '100000')} 
>>> def get_line(bits, default='default'): 
...  for k, v in mapper.items(): 
...   if bits in v: 
...    return k 
...  return default 
... 
>>> get_line('100101') 
'a' 
>>> get_line('000100') 
'b' 
>>> get_line('1', 'z') 
'z' 

Так что ваш код будет выглядеть

P_line.Line = get_line(self.Ends) 

или с дополнительным умолчанию

P_line.Line = get_line(self.Ends, 'z') 
Смежные вопросы