我想做的事情不起作用: 整体清单......
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]
现在到了这一点; 这样做的正确方法是什么?
答案 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]