Home > Software design >  Generate list of copies in Python
Generate list of copies in Python

Time:12-25

I want to generate list of 100 copies of the same sentence with one char modified in each copy. I am currently learning python and I don't understand why something like this:

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

modifies all copies. I want to get something like this: ['AAAB', 'BAAA', 'ZAAA', ...], like they are independent from each other, but I get: ['AAAB', 'ZAAB', 'ZCAB', ...]. How can I do it?

CodePudding user response:

Not sure how did you get result you pasted - string in python is immutable. copies is list of strings. So copy is string. You cannot type copy[0] = 'a' as you will get TypeError: 'str' object does not support item assignment cause of that.

What do you want to do is build changed sequence when you create 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

EDIT: I noticed you pass list as seq. If so, copies are not a copies! Look

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

When type is mutable, by using a variable you use the reference. So all copies elements points to the same place in memory. You need to use copy function of list.

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