Int列表上的Python位操作

时间:2014-03-12 16:02:04

标签: python list int immutability mutable

我想做的事情不起作用: 整体清单......

BebossArray=[0 for i in xrange(1024)]

我的位功能(有通常的设置,清除,切换,测试,但这里设置)

def setBit(dint, offset):
mask = 1 << offset
dint=(dint|mask)
return

所以我想在列表中的一个int中设置一个...

setBit(DebossArray[index],3)

当然,这不起作用。 setBit中的赋值只是创建一个新对象,DebossArray [index]按预期保持put。所以我认为INT是不可变的,所以我无法做出改变。

我做了什么......(我不喜欢它,但它适用于我的目的)

DebossArray=[ctypes.c_int32() for x in xrange(1024)]

def setBit(dint, offset):
mask = 1 << offset
dint.value=(dint.value|mask)
return

所以现在

setBit(DebossArray[index],3]

按预期工作,因为ctype.c_int32()是可变的,所以我可以在适当的位置修改它。

我使用的是2.7,但是可能会在项目的后期滚动到3。我也试图远离

DebossArray[index]=setBit(DebossArray[index],3)

构造类型。

更多细节: 在某些地方我有DebossArray [x]而在其他地方我有ButtonArray [x] [y]

现在到了这一点; 这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

我认为你已经过度复杂了,只需返回结果并重新绑定原始名称:

def setBit(dint, offset):
    mask = 1 << offset
    return dint | mask

r = 0
r = setBit(r, 5)
# 32

你甚至不需要一个功能,你可以这样做:

i = 0
i |= (1 << 5)
# 32

答案 1 :(得分:0)

使用这样的类:

class BebossArray(object):
    def __init__(self):
        self._l = [0 for i in xrange(1024)]

    def setBit(self, index, offset):
        self._l[index] = (self._l[index]|1 << offset) 

或者只是让setBit接受列表,索引和偏移量,并用新值替换索引处的值。

答案 2 :(得分:0)

你的意思是这样吗?

DebossArray = [0 for i in xrange(4)]

def setBit(dint, index, offset):
    dint[index] |= 1 << offset

print DebossArray  # [0, 0, 0, 0]
setBit(DebossArray, 2, 3)
print DebossArray  # [0, 0, 8, 0]