我想做的是将一个字符串(密码)分成多个组,并不复制(假设每7个字符分成一组),我要做的就是是每7个字母取一个,并将它们添加到二维数组中的一行中,接下来的7个以此类推。依此类推。
我试图用两个三维数组来做到这一点,但我遇到了一个问题,它总是在每次更新时更改我所有的数组,而我不想复制它。
让我给你举个例子:
def splitter(cipher,key_length):
rows = math.ceil(len(cipher)/key_length)
columns = key_length
arr = [[""]*columns]*rows
arr1=[]
for row in range(rows):
for column in range(columns):
if (row * columns + column)< len(cipher):
arr[row][column] = cipher[row * columns + column]
else:
arr[row][column] = ""
arr1.append(arr[row])
print(arr1)
splitter("QPWKALVRXCQZIKGRBPFAEOMFLJMSDZVDHXCXJYEBIMTRQWNMEAIZRVKCVKVLXNEICFZPZCZZHKMLVZVZIZRRQWDKECHOSNYXXLSPMYKVQXJTDCIOMEEXDQVSRXLRLKZHOV",7)
打印的结果是它重复了all数组的至少7个字符,我很想知道为什么会发生这种情况,而我所缺少的是什么?
此打印结果为:
[['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', '']]
答案 0 :(得分:1)
问题是这一行:
arr = [[""] * columns] * rows
这是Python的“陷阱”-表面上看起来像应该做一件事的一段代码,但实际上做的是完全不同的事情,尽管区别很小。
您想要的是一个包含rows
个不同行的列表。您实际上得到的是一个包含许多对同一行的引用的列表。代码[""] * columns
仅创建一个列表,因此,当您将第二行的值填写到该列表中时,它将覆盖先前存储在其中的第一行的值;那么第三行的值会覆盖第二行的值,依此类推,因为它们都是对同一列表的引用。
您可能会发现visualise the execution step-by-step有帮助,以了解发生了什么情况。此链接使用了非常出色的Python Tutor工具。
解决方案是显式创建rows
个不同的列表:
arr = [[""] * columns for i in range(rows)]