Python 位数组列表和就地异或运算的奇怪行为 ^=

问题描述 投票:0回答:1

我成功地隔离了(我认为的)Python 中位数组列表和 XOR 操作之间的奇怪关系。

这是我的最小示例:

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. 为什么第二个代码块产生的结果与第一个不同?我认为也许 * 操作只是复制引用(这可以解释为什么两个列表元素都被更改),但我无法仅使用(整数)1 和 0 来复制该行为。
  2. 为什么将 ls[0] ^= bitarray('1') 扩展为 ls[0] = ls[0] ^ bitarray('1') 将输出恢复为与第一个代码块相同?我理解 ^= 是后一个表达式的简单简写。

感谢您的帮助!

python xor bitarray
1个回答
0
投票

这与

^=
无关,而是与您创建列表的方式有关。

第一个示例是一个包含对两个单独对象的引用的列表:

>>> ls = [object(), object()]
>>> ls[0] is ls[1]
False

第二个示例是一个列表,其中包含对 same 对象的两个引用:

>>> ls = [object()] * 2
>>> ls[0] is ls[1]
True
© www.soinside.com 2019 - 2024. All rights reserved.