在 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
是不可变的。 copies
是 strings
的列表。所以 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)]
我想生成同一个句子的 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
是不可变的。 copies
是 strings
的列表。所以 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)]