我不确定如何解释这一点,但这是我当前得到的输出:
0x0 PUSH1 80 ['80']
0x2 PUSH1 40 ['40']
0x4 MSTORE []
0x8 PUSH2 0010 ['0010']
每当出现一个PUSH项目时,我想将最后一个项目水平插入列表中,这样就得到了堆栈的这种表示形式:
0x0 PUSH1 80 ['80']
0x2 PUSH1 40 ['40', '80']
0x4 MSTORE
0x8 PUSH2 0010 ['0010', '40', '80']
这是我当前的代码:
for (addr, op, params), y in zip(self.instructions, self.stack[::-1]):
codes = []
for x in range(0, 33):
if op == 'PUSH' + str(x):
codes.append(params)
print addr + "\t" + op + "\t\t" + params + "\t" + str(codes)
很抱歉,如果不清楚,请坚持几个小时,谢谢您的帮助!
答案 0 :(得分:2)
您的问题在您发布的代码的第二行。您正在循环的每个迭代中执行codes = []
,这会擦除代码列表的内容。尝试将其移到for
循环上方,以免被擦除。
此外,由于您实际上不需要循环33次来检查代码,因此实现似乎效率很低,您可以使用比较。首先,通过执行number = int(op[-1])
在操作结束时获得数字,然后只需检查if (op[0:-1] == 'PUSH') and (0 <= number < 33): ...
答案 1 :(得分:1)
我看到这段代码中有两个问题。
1。
第2行中的codes = []
为list
分配了一个空codes
,这就是为什么您总是在codes
中以单个值结束的原因。
2。
要将params
插入列表的前面,请使用codes = params + codes
或codes.insert(0,params)
或codes[:0] = [params]
答案 2 :(得分:1)
我认为在FOR循环中初始化“代码”会导致此问题。此外,列表上的append函数将元素添加到最后,如果您想将元素添加到第一个位置,则可能要使用insert和position参数。您可以尝试以下方法。
codes = []
for (addr, op, params), y in zip(self.instructions, self.stack[::-1]):
for x in range(0, 33):
if op == 'PUSH' + str(x):
codes.insert(0, params)
new_codes = codes
else:
new_codes = []
print addr + "\t" + op + "\t\t" + params + "\t" + str(new_codes)