我正在尝试遍历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作为其输入。如果我追加一个新的列表,这个函数将是不可逆的。
我怀疑这个问题与for名称空间有关- output[i]会在python循环中创建一个新的局部变量。如果这确实是问题所在,我该如何解决呢?
发布于 2017-09-24 14:41:35
TLDR:在循环中复制要改变的列表。
复制要处理的列表并不会使函数变得不可逆。一个变异的列表本质上是一个新列表“(在数学意义上)。
在不同的函数中,逆转这个过程仍然是可能的。
最好的做法是对正在处理的列表进行复制。
这段代码似乎是一个试图直接修改其对象的方法。这真的是你想要的吗?如果是这种情况,请查看元类。
假设你想要修改一个对象的属性,你可以创建一个属性self.original_,它表示要加扰的列表,并且只是一个加扰函数。这样,您不需要unsrambe函数,因为您可以根据需要更新属性。
https://stackoverflow.com/questions/46387223
复制相似问题