变异算法python

时间:2014-04-23 10:27:37

标签: python algorithm constants

所以我有一个算法,它采用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)中的参数在某种程度上不会保持不变并且正在变化为列表"数据"变化。

有人知道为什么会发生这种情况,或者可以为我的问题提供某种理由或解决方案吗?

2 个答案:

答案 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