Python如何让列表操作每次基于原始列表执行,恢复列表初始状态?
问题根源
你当前代码中的rotorI是可变的列表对象,循环内执行的rotorI.append(rotorI.pop(0))是直接修改原列表的内存数据,没有重置机制,所以每次循环都会在上一次修改后的结果基础上继续操作,和你要的「每次都从初始列表开始执行」的需求不符。
解决方法
先把转子的初始值单独存为常量,每次接收用户输入前,都用初始值覆盖当前操作的列表即可,修改后的代码如下:
# 初始值存为常量,全程不会被修改 ROTOR_I_INIT = ['E', 'K', 'M', 'F', 'L', 'G', 'D', 'Q', 'V', 'Z', 'N', 'T','O', 'W','Y','H', 'X', 'U', 'S', 'P', 'A', 'I', 'B', 'R', 'C', 'J'] while True: # 每次循环都从初始值拷贝一份新的操作列表 rotorI = ROTOR_I_INIT.copy() msg = input("Enter a msg: ") for i in range(len(msg)): rotorI.append(rotorI.pop(0)) print(rotorI)
如果你不想循环操作列表,也可以直接用列表切片实现相同的移位效果,代码更简洁:
ROTOR_I_INIT = ['E', 'K', 'M', 'F', 'L', 'G', 'D', 'Q', 'V', 'Z', 'N', 'T','O', 'W','Y','H', 'X', 'U', 'S', 'P', 'A', 'I', 'B', 'R', 'C', 'J'] while True: msg = input("Enter a msg: ") offset = len(msg) print(ROTOR_I_INIT[offset:] + ROTOR_I_INIT[:offset])
以上两种修改方式都能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者User1
相关产品推荐
相关产品推荐

