2017-09-24 84 views
0

我想通過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 

爲了澄清,selfref_key是兩個列表bytes-如[b'a', b'c', b'xb0']

我知道,這不是通常的做法是編輯一個正在通過在Python循環列表,但在這種情況下,我需要這樣做,因爲整個過程需要通過另一個函數進行反轉,該函數僅將outputref_key作爲其輸入。如果我追加到新列表中,該功能將不可逆。

我懷疑這個問題與python命名空間有關 - output[i]會在for循環中創建一個新的局部變量。如果這確實是問題,我該如何解決它?

回答

0

TLDR:使列表的副本在循環中進行變異。

製作要處理的列表的副本不會使功能變得可以使用。突變的列表本質上是一個``新名單」(在數學意義上的)。

倒車過程中應該還是有可能在不同的功能。

這是最適合你,使列表的副本正在處理中。

此代碼似乎是試圖直接修改其對象的方法。這是你真正想要的嗎?如果是這樣的話看的到元類。

假設你要修改的屬性一個對象,你可以使一個屬性self.original_表示要被加密的列表,以及只是爭奪函數。這樣你就不需要unsrambe函數,因爲你可以根據需要更新屬性。