所以我有一个算法,它采用10个字符的列表,并创建10个新的字符列表,每个字符都带有e字符"变异"。
(我必须使用字符列表而不是字符串,因为字符串对象不支持项目分配)
例如,这将是所需的输出:
输入字:H E L L O W O R L D。
H I L L O W O R L D。
H U L L O W O R L D。
H E L L O K O R L D。
等等。
现在有了我的程序,我得到一个奇怪的输出。
import random
def generation(myList2):
data=[]
for a in range(10):
data.append(myList2)
data[a][random.randint(0,9)]=random.choice("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split())
return data
myName=raw_input()
data=generation(myName.split())
for i in data:
print(i)
输出:
H I L K E F G J E。
H I L K E F G J E。
H I L K E F G J E。
H I L K E F G J E。
H I L K E F G J E。
等等。
似乎我的函数(myList2)中的参数在某种程度上不会保持不变并且正在变化为列表"数据"变化。
有人知道为什么会发生这种情况,或者可以为我的问题提供某种理由或解决方案吗?
答案 0 :(得分:2)
您正在将引用附加到结果列表中,实际上您所做的只是一遍又一遍地操作相同的列表,并将其新引用添加到结果列表中。
如果您想要一个包含所有“突变”的列表,则需要在每次迭代时clone列表。 (该链接提供了一些有关克隆python列表的有用解决方案)。正如您在链接中看到的,克隆列表的最简单方法可能是newCopy = myList2[:]
答案 1 :(得分:2)
非常容易,将您的generation
方法更改为:
for a in range(10):
data.append(myList2[:])
而不是:
for a in range(10):
data.append(myList2)
这样,数据中的每个元素都不包含对相同 myList2对象的引用。 myList2[:]
创建对象的副本。
此外,而不是
for i in data:
print(i) #prints list of characters in a not-so-nice format
做的:
for i in data:
print(''.join(i)) #prints string