Randomly generating different list from list

Question:

first I created a list called “citys” then it tried to swap randomly two elements in the “citys” list for 5 times and at the same time tried to store the new lists in the “number_of_citys” but it turns out bad every time it loops, it insert the last swapped arrays only.
I used this randomly generated list ,
citys= [[1,2], [3,4],[1,3],[5,2]] , to create another list. And I expected my list to be,
orders_of_citys=[[[1,2], [5,2],[1,3][3,4]] , [[5,2], [1,2],[1,3][3,4]],[ [1,3], [1,2],[5,2][3,4]], [[3,4], [1,2],[5,2][1,3]], [1,3], [1,2],[5,2][3,4]] ]
but I got the following
order_of_citys =[[[1,3], [1,2],[5,2][3,4]], [1,3], [1,2],[5,2][3,4]], [1,3], [1,2],[5,2][3,4]] ,[1,3], [1,2],[5,2][3,4]], [1,3], [1,2],[5,2][3,4]]]
I have used append(), +=, and insert built in function and operators but I still get the same array. please I would like some one to point me my problem.The code I wrote is the following.

import random
  
citys = []
number_of_cities = 5
orders_of_citys = []
pop = 5

#give random place for cities on 2D plane
for i in range(number_of_cities):
        citys.append( [ random.randint(0, 1000), random.randint(0, 1000)])

#suffle  points (citys) position to get different path
def swap(c, a, b):
        value = c[a]
        c[a] = c[b]
        c[b] = value
        return c

for j in range(pop):
    a = random.randint(0, len(citys)-1)
    b= random.randint(0, len(citys)-1)
    new_path = swap(citys, a, b)
    orders_of_citys.append(new_path)

Thanks!

Answers:

Your swap function is literally modifying the array, not returning a new array. So orders_of_citys contains five copies of the exact same array, and any time you. modify one of those arrays using swap, you’re modifying all of them.

If you really want to see what’s going on, change the last line to be

orders_of_citys.append(new_path[:])

which makes a copy of the array and then appends it to the variable.

Answered By: Frank Yellin

The new_path is actually a reference to citys, and you append the reference. Once the citys is changed, all the referred data will be changed too, so it have the same data.

And the solution is to make a deep copy of the array and append the copy.

from copy import deepcopy

# Other codes

def swap(c, a, b):
    d = deepcopy(c)
    value = d[a]
    d[a] = d[b]
    d[b] = value
    return d

The solution above is more easier. I’m late QwQ

Answered By: BadCodeBuilder
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.