Найти - Пользователи
Полная версия: Странное поведение с булевыми переменными
Начало » Python для новичков » Странное поведение с булевыми переменными
1
@cckyi_boxxx
Вопрос касается работы оператора and cо списками булевых переменных
на примере списков с двумя элементами все работает вполне ожидаемо:
 l1 = [True, True]
l2 = [True, False]
print(l1 and l2 , l1 or l2)
>>> [True, False] [True, True]

но при реализации со списками размером по 10 элементов в каждом возникли проблемы

 print([True, True, True, False, True, True, True, True, False, False] and [True, True, True, True, True, True, True, True, True, True])
>>> [True, True, True, True, True, True, True, True, True, True]
по каким-то неведомым причинам and отработал совсем не как ожидалось


пытался на практике при помощи таких операций запилить систему включения\выключения кнопок пользователю, а именно при помощи наложения маски на текущее (основное) состояние, при помощи простенькой функции приведенной ниже всем управлять, но столкнулся с описанной выше проблемой
 def set_controls_state(self, mask):
    prev = list() # в отдельных случаях надо будет вернуться к прежнему состоянию
    for x, z in zip(mask, self.controls): # self.controls == список кнопок состоянием которых управляем
        prev.append(z.isEnabled())
        z.setEnabled(x)
    return prev

эту задачу конечно можно реализовать и кучей if-ов, но учитывая то что сигналов для включения-выключения множество, и часть из них после определенных действий требует возврата строго к прежнему состоянию ,я выбрал такой метод, если кто-то знает более адекватный буду рад любой инфе.
doza_and
Операторы and и or работают ровно так как описано в документации.
 l1 = ["Петя"]
l2 = ["Маша"]
print(l1 and l2 , l1 or l2)
bl1=0b1100
bl2=0b1010
print(bin(bl1 & bl2), bin(bl1 | bl2))
import numpy as np
l1=np.array([1,1,0,0])
l2=np.array([1,0,1,0])
print(l1 & l2, l1 | l2)
['Маша'] ['Петя']
0b1000 0b1110
[1 0 0 0] [1 1 1 0]
@cckyi_boxxx
в ваших примерах нет списков с булевыми переменными, что and и or во всех остальных случаях работают корректно речи не шло, а вот с такими списками чертовщина как на скрине ниже
в ответе ожидалось увидеть
  [True, True, True, False, True, True, True, True, False, False]
а не все тру



нажмите для увеличения
rami
@cckyi_boxxx
по каким-то неведомым причинам and отработал совсем не как ожидалось
and работает правильно, смотрите в документацию x and y. if x is false, then x, else y если слева от and вычисляется как false, то вернёт то, что слева, в вашем случае слева находится непустой список который всегда вычисляется как true независимо от содержания и количества элементов, поэтому будет возвращено то, что находится справа.
@cckyi_boxxx
Спс, я думал со списками он для каждого элемента списка так сделает и вернет список попарно обработанных элементов, видимо без еще одного цикла или генератора это не запилить, но зато понятно где моя ошибка и как реализовать задуманное
Rodegast
 >>> s1 = [True, False, False]
>>> s2 = [False, False, True]
>>> from operator import and_, or_
>>> list(map(and_, s1, s2))
[False, False, False]
>>> list(map(or_, s1, s2))
[True, False, True]
@cckyi_boxxx
сенкс, уже запилил иначе
 [x & z for x,z in zip(mask, mask2)] # mask и mask2 - исходные списки
py.user.next
@cckyi_boxxx
я думал со списками он для каждого элемента списка так сделает и вернет список попарно обработанных элементов
Да, ты просто не правильно думал.

@cckyi_boxxx
на примере списков с двумя элементами все работает вполне ожидаемо:
Да, ты просто не понял, как оно на самом деле работает.

@cckyi_boxxx
уже запилил иначе
Да, это правильный подход. В случае установки флажков нужно использовать биты в числе по степени двойки. Степени двойки я у тебя не вижу только, а это важный момент.

  
>>> buttons = 0
>>> 
>>> COLOR_GREEN = 0x1
>>> COLOR_RED = 0x2
>>> COLOR_YELLOW = 0x4
>>> COLOR_BLUE = 0x8
>>> COLOR_ORANGE = 0x10
>>> COLOR_WHITE = 0x20
>>> COLOR_BROWN = 0x40
>>> COLOR_VIOLET = 0x80
>>> COLOR_BLACK = 0x100
>>> COLOR_NEXT = 0x200
>>> 
>>> buttons |= COLOR_BLACK
>>> buttons |= COLOR_WHITE
>>> buttons |= COLOR_RED
>>> buttons |= COLOR_GREEN
>>> buttons |= COLOR_BLUE
>>> buttons |= COLOR_ORANGE
>>> buttons |= COLOR_VIOLET
>>> buttons |= COLOR_YELLOW
>>> buttons |= COLOR_BROWN
>>> 
>>> buttons
511
>>> bin(buttons)
'0b111111111'
>>> 
>>> print('See black', bool(buttons & COLOR_BLACK))
See black True
>>> 
>>> print('See yellow', bool(buttons & COLOR_YELLOW))
See yellow True
>>> 
>>> print('See next', bool(buttons & COLOR_NEXT))
See next False
>>>
Arushi
никогда не выпадала у меня такая проблема
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB