To, czego doświadczasz, to pojęcie referencji. Wszystkie obiekty w Pythonie mają odniesienie i jeśli przypiszesz jedną do dwóch nazw a
i b
, spowoduje to, że zarówno a
, jak i b
będą wskazywały na ten sam obiekt .
>>> a = range(3)
>>> b = a # same object
>>> b.append(3)
>>> a, b # same contents
([0, 1, 2, 3], [0, 1, 2, 3])
listach możesz utworzyć nową listę b
który jest skopiować innego a
użyciu b = a[:]
.
>>> a = range(3)
>>> b = a[:] # make b a new copy of a
>>> b.append(3)
>>> a, b # a is left unchanged
([0, 1, 2], [0, 1, 2, 3])
Aby uzyskać bardziej ogólne rozwiązanie dla dowolnego obiektu, należy użyć copy module. Płytka kopia skopiuje odniesienia przechowywane w kopiowanym obiekcie, podczas gdy głęboka kopia rekurencyjnie utworzy nowe kopie wszystkich obiektów.
>>> a = [range(2), range(3)]
>>> b = copy.copy(a) # shallow copy of a, equivalent to a[:]
>>> b[0] = range(4)
>>> a, b # setting an element of b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1, 2, 3], [0, 1, 2]])
>>> b[1].append(3)
>>> a, b # modifying an element of b modifies the element in a
([[0, 1], [0, 1, 2, 3]], [[0, 1, 2, 3], [0, 1, 2, 3]])
>>> a = [range(2), range(3)]
>>> b = copy.deepcopy(a) # deep recursive copy of a
>>> b[1].append(3)
>>> a, b # modifying anything in b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1], [0, 1, 2, 3]])
Cóż, nie znasz Pythona. A przynajmniej nie znasz ważnej części tego, jakie są zmienne. Zobacz podobne pytanie na SO lub np. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables. – delnan
@delnan, aby być uczciwym, nie jest to niecodzienna pułapka dla ludzi, którzy są nowicjuszami w pythonach, aby zrozumieć, że przypisanie zmiennych z listami przypisuje referencje, chociaż twierdzenie "Myślałem, że znam Pythona" ma tendencję do wskazywania, że nie są one "nowe":) –