hex_list元素重赋值未生效引发无限循环,求技术解析
十六进制字符串处理时的无限循环问题
以下是测试十六进制与二进制转换函数的代码片段(函数均接收并返回字符串):
import random # 原代码缺少该导入,补充以保证可运行 hex_list = [] for i in range(50): hex_list.append("0X" + "".join([random.choice("0123456789ABCDEF") for j in range(10)])) for index, hex in enumerate(hex_list): iterations = 0 while hex_list[index][2] == "0": print(f"ENTERING LOOP FOR ZERO AT THE LEFT IN {hex}") print("BEFORE ", hex_list[index]) hex_list[index] = hex[:2] + hex[3:] print("AFTER ", hex_list[index]) iterations += 1 if iterations > 5: print("\n5 ATTEMPTS REACHED FOR {hex}\n") break
问题原因
核心bug是循环中误用了原始字符串副本,而非列表的当前元素:
- 在
for index, hex in enumerate(hex_list):循环里,hex是列表元素的初始副本,后续修改hex_list[index]不会同步更新这个hex变量。 - 执行
hex_list[index] = hex[:2] + hex[3:]时,始终用的是循环开始时的原始hex字符串来拼接,根本没用到列表里已经修改过的最新值。 - 举个例子:如果初始
hex是0X00ABCDEF12,第一次修改后hex_list[index]变成0X0ABCDEF12,但下一次循环你还是用原始hex生成同样的结果,等于没改,自然陷入无限循环。
修复方法
修改时基于hex_list[index]的当前值操作,替换掉代码中的赋值行:
hex_list[index] = hex_list[index][:2] + hex_list[index][3:]
这样每次循环都会基于列表里的最新字符串去掉开头的0,直到第3位不是0为止,不会再出现死循环。
内容的提问来源于stack exchange,提问作者user21767142
相关产品推荐
相关产品推荐

