Странное поведение со списками битовых массивов Python и операцией XOR на месте ^=Python

Программы на Python
Anonymous
Странное поведение со списками битовых массивов Python и операцией XOR на месте ^=

Сообщение Anonymous »

Мне удалось изолировать (как мне кажется) странную связь между списками битовых массивов и операцией XOR в Python.
Вот мой минимальный пример:

Код: Выделить всё

ls = [bitarray('0'), bitarray('0')]
ls[0] ^= bitarray('1')
print(ls)
> [bitarray('1'), bitarray('0')]

ls = [bitarray('0')]*2
ls[0] ^= bitarray('1')
print(ls)
> [bitarray('1'), bitarray('1')]

ls = [bitarray('0'), bitarray('0')]
ls[0] = ls[0] ^ bitarray('1')
print(ls)
> [bitarray('1'), bitarray('0')]
У меня есть два естественных вопроса:
  • Почему второй блок кода дает другой результат, чем первый? Я думал, что, возможно, операция * просто дублирует ссылку (что объясняет, почему были изменены оба элемента списка), но я не могу воспроизвести поведение, используя только (целые) 1 и 0.
  • Почему расширение ls[0] ^= bitarray('1') до ls[0] = ls[0] ^ bitarray('1') возвращает вывод к тому же состоянию, что и первый блок кода? Я понял, что ^= — это просто сокращение последнего выражения.
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/790 ... -operation

Вернуться в «Python»