在 Python 中生成副本列表

Generate list of copies in Python

我想生成同一个句子的 100 个副本的列表,每个副本修改一个字符。我目前正在学习 python,但我不明白为什么会这样:

def generate_copy(seq):
    copies = [seq for i in range(100)]
    for copy in copies:
        copy[random.randint(0, len(seq) - 1)] = random.choice(char_list)
        print(''.join(copy))
    return copies

修改所有副本。我想得到这样的东西:['AAAB'、'BAAA'、'ZAAA'、...],就像它们彼此独立一样,但我得到:['AAAB' , 'ZAAB', 'ZCAB', ...]。我该怎么做?

不确定您是如何获得粘贴的结果的 - python 中的 string 是不可变的。 copiesstrings 的列表。所以 copy 是字符串。你不能输入 copy[0] = 'a' 因为你会得到 TypeError: 'str' object does not support item assignment 的原因。

你想做的是在创建 copies 时构建更改的序列。

def change_random_letter(seq, char_list):
    i = random.randint(0, len(seq) - 1)
    new_letter = random.choice(char_list)
    return f"{seq[:i]}{new_letter}{seq[i+1:]}"


def generate_copy(seq):
    copies = [change_random_letter(seq, char_list) for _ in range(100)]
    return copies

编辑:我注意到您将列表作为 seq 传递。如果是这样,copies 不是副本!看

l = [1, 2]
ll = [l, l]
ll[0][0] = "A"
print(ll) # [['A', 2], ['A', 2]]

当类型是可变的时,通过使用变量你就可以使用引用。所以所有 copies 元素都指向内存中的同一个位置。你需要使用列表的copy函数。

    copies = [seq.copy() for _ in range(100)]