Python:编辑for循环中的特定列表索引
问题描述:
我想通过Python中的列表循环,对其进行一些更改,然后输出结果。这里的功能:Python:编辑for循环中的特定列表索引
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
是两个列表bytes-如[b'a', b'c', b'xb0']
我知道,这不是通常的做法是编辑一个正在通过在Python循环列表,但在这种情况下,我需要这样做,因为整个过程需要通过另一个函数进行反转,该函数仅将output
和ref_key
作为其输入。如果我追加到新列表中,该功能将不可逆。
我怀疑这个问题与python命名空间有关 - output[i]
会在for
循环中创建一个新的局部变量。如果这确实是问题,我该如何解决它?
答
TLDR:使列表的副本在循环中进行变异。
制作要处理的列表的副本不会使功能变得可以使用。突变的列表本质上是一个``新名单”(在数学意义上的)。
倒车过程中应该还是有可能在不同的功能。
这是最适合你,使列表的副本正在处理中。
此代码似乎是试图直接修改其对象的方法。这是你真正想要的吗?如果是这样的话看的到元类。
假设你要修改的属性一个对象,你可以使一个属性self.original_表示要被加密的列表,以及只是争夺函数。这样你就不需要unsrambe函数,因为你可以根据需要更新属性。