7

I'm using python and want to shuffle a copied list that I write after that into a txt file (see my code below).

Why does the shuffle function randomize the original list, too? I only use the copy for the function call.

Any ideas? Thank you !

from random import shuffle

def shuffleList2txt(myList):
    shuffle(myList)

    f = open('randList.txt','w')
    f.write(str(liste))
    f.close()

    return(myList)


liste = [1,2,3,4,5,6,7,8,9,10]
copy = liste
shuffledList = shuffleList2txt(copy)

liste and shuffledList are the same ! Why? liste should be the original one and shuffledList should be the shuffled list.... :)

Chanda Korat
  • 2,453
  • 2
  • 19
  • 23
HKC72
  • 502
  • 1
  • 8
  • 22
  • not sure if you read [this](https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference) before, but I think it's good thing to know in your case. – stucash Dec 11 '17 at 10:33
  • 1
    You and your partner have a dog. You call her "Jo" and your partner calls her "Krok", Now your partner calls a grooming service to trim the hair of Krok, do you expect that when you'll get home Jo has still long hair? the list object, though named in two different manners, is still the same old dog! please refer to [this question](https://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list?s=1|749.8298) (or any of the tens of answers on this topic) to overcome this issue. – gboffi Dec 11 '17 at 10:37
  • Haha... Thanks gboffi for this beautiful explanation :) – HKC72 Dec 11 '17 at 11:37
  • The way you shuffle a copied list without shuffling the original list, is to shuffle it. The problem is that the code shown **does not copy** the list. Therefore, the actual question is "how do I copy a list?", and this is a common duplicate. – Karl Knechtel Apr 19 '23 at 09:37

1 Answers1

26

random.shuffle works in place. Of course you could make a copy of the list prior to shuffling, but you'd be better off with random.sample, by taking a sample ... of the whole list:

>>> l = [1,2,3,4]
>>> random.sample(l,len(l))
[3, 1, 2, 4]
>>> l
[1, 2, 3, 4]

so assigning the result of random.sample gives you a new, shuffled list without changing the original list.

Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219