Komentarz do Jak mogę obejść deklarowanie nieużywanej zmiennej w pętli for?(Skończył się rozmiar komentarza)
Python zachowuje to samo odniesienie do utworzonego obiektu. (niezależnie od zmienności), na przykład
In [1]: i = 1
In [2]: j = 1
In [3]: id(i)
Out[3]: 142671248
In [4]: id(j)
Out[4]: 142671248
Widzisz, jak i i j odnoszą się do tego samego obiektu w pamięci. Co się dzieje, gdy zmienimy wartość jednej niezmiennej zmiennej.
In [5]: j = j+1
In [6]: id(i)
Out[6]: 142671248
In [7]: id(j)
Out[7]: 142671236
widać, że j zaczyna teraz wskazywać nową lokalizację (gdzie jest zapisane 2), a i nadal wskazuje na lokalizację, w której jest zapisane 1. Oceniając,
j = j+1
Wartość jest pobierana z 142671248, obliczana (jeśli nie została jeszcze zapisana w pamięci podręcznej) i umieszczana w nowej lokalizacji 142671236. j jest wykonywana w celu wskazania nowej lokalizacji. Mówiąc prościej, nowa kopia tworzona za każdym razem, gdy modyfikowana jest niezmienna zmienna.
Zmienność
Pod tym względem zmienne obiekty zachowują się trochę inaczej. Gdy wartość wskazywana przez
In [16]: a = []
In [17]: b = a
In [18]: id(a)
Out[18]: 3071546412L
In [19]: id(b)
Out[19]: 3071546412L
Zarówno a, jak i b wskazują to samo miejsce w pamięci.
In [20]: a.append(5)
Miejsce w pamięci wskazywane przez a jest modyfikowane.
In [21]: a
Out[21]: [5]
In [22]: b
Out[22]: [5]
In [23]: id(a)
Out[23]: 3071546412L
In [24]: id(b)
Out[24]: 3071546412L
Oba a i b nadal wskazują to samo miejsce w pamięci. Innymi słowy, zmienne zmienne działają w tym samym miejscu w pamięci, na które wskazuje zmienna, zamiast tworzyć kopię wartości wskazywanej przez zmienną, jak w przypadku zmiennej niezmiennej.