【问题标题】:Generate list of copies in Python在 Python 中生成副本列表
【发布时间】:2022-01-25 07:34:22
【问题描述】:

我想生成同一句子的 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' , ...]。我该怎么做?

【问题讨论】:

  • 你认为[seq for i in range(100)] 会做什么?
  • 生成100个seq副本的列表
  • 不:它是 100 次引用对同一个列表,这应该可以解释您所看到的行为。

标签: python list loops char


【解决方案1】:

不确定您是如何获得粘贴的结果的 - 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)]

【讨论】:

  • 是的,我知道字符串是不可变的,这就是为什么 seq 和 copy in for 是列表,但感谢您的回答。它现在工作正常,但我仍然不明白为什么在我创建“副本”(即 2d 列表列表)并且我想修改副本中的一个列表之后,所有这些列表都被修改了
  • @BooBoo 抱歉,我刚刚发现您的seq 是列表。更新答案
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 2019-01-07
  • 2012-07-14
  • 2020-09-25
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多