我已经编程了大约1周。
我正在编写一个简单的程序来遍历此List并每次将变量递增1。
我收到错误:列表索引超出范围。
我相信这是因为我的指数值太高了? 但我在使用以下内容之前重置索引值:
index += 1
index and 7
逻辑AND应该在索引变为> = 8时将索引重置为0,不是吗?
在这种情况下,我不明白出了什么问题。请看我的代码:
lookups = [0,1,2,3,4,5,6,7]
index = 0
dword_C06748 = 0
count = 0
offset1 = 0
rn_offset = 0
def next_value():
global lookups, index, count
while count < 18:
lookups[index] += 1
index += 1
index and 7
count += 1
next_value()
答案 0 :(得分:3)
index and 7
未重置index
。它只是评估一个未保存的布尔值。所以这个陈述没有效果。
请改用index = index % 8
。这样可以确保索引始终低于8。
或者您可以使用
index = index % len(lookups)
答案 1 :(得分:2)
and
在python中是布尔AND
,使用&
进行逐位AND:
index &= 7 #index = index & 7
由于整数是不可变的,因此您应该将结果重新分配回index
。
答案 2 :(得分:1)
答案 3 :(得分:1)
我建议你使用:
if index >= 8:
index = 0
或
index = index % 8
或使用inplace modulo operator
的替代方法index %= 8
正如它在Python的Zen中所说(打开一个Python窗口并输入import this
),可读性很重要。
这些选项比代码的更正版本更具可读性,使用按位and
代替,因此您应该使用它们。
答案 4 :(得分:1)
我认为以下内容将以更加pythonic的方式复制代码的输出:
lookups = [0,1,2,3,4,5,6,7]
def next_value():
# xrange returns the value 0, 1, ... 17
for count in xrange(18): # or just range if you are using py3
# the mod makes sure the index is always less than 8
lookups[count % 8] += 1
next_value()