我正在尝试遍历Python中的列表,对其进行一些更改,然后输出结果。这是功能:
def scramble_bytes(self, ref_key):
"""
Uses ref_key as a reference to scramble self.
They must be equal-length lists of bytes
"""
if len(self) != len(ref_key):
return "Inputs to scramble_bytes must be equal length!"
scrambles_needed = range(len(self))
scramble_length = len(self)
output = self
for i in scrambles_needed:
scramble_selector = int.from_bytes(ref_key[i], byteorder='big')
scrambler_byte = int.from_bytes(output[(scramble_selector + i) % scramble_length], byteorder='big')
scrambled_byte = int.from_bytes(output[i], byteorder='big')
result_scramble = scrambler_byte ^ scrambled_byte
output[i] = result_scramble.to_bytes(1, byteorder="big")
return output
为了澄清,self
和ref_key
都是字节列表,例如[b'a', b'c', b'xb0']
我知道编辑一个在Python中循环的列表并不常见,但在这种情况下我需要这样做,因为整个过程需要通过另一个只获得output
的函数来反转和ref_key
作为其输入。如果我附加到新列表,该功能将不可逆。
我怀疑问题与python名称空间有关 - output[i]
会在for
循环中创建一个新的局部变量。如果这确实是问题,我该如何解决?
答案 0 :(得分:0)
TLDR:制作要在循环中变异的列表的副本。
制作要处理的列表的副本不会使该功能无法实现。变异列表本质上是一个“新列表”#34; (在数学意义上)。
在不同的功能中仍然可以反转过程。
最好制作正在处理的列表的副本。
此代码似乎是一种尝试直接修改其对象的方法。这是你真正想要的吗?如果是这种情况,请查看元类。
假设您要修改对象的属性,可以创建一个属性self.original_,它表示要加扰的列表,以及加扰函数。这样您就不需要unsrambe功能,因为您可以根据需要更新属性。