Dziękuję wszystkim za pomoc (szczególnie Tobie Rob za bardzo użyteczne
linki). Myślę, że już to mniej więcej pojmuję. A mianowicie:
Dokonując "przypisania" nie robię nic innego, tylko wprowadzam do
przestrzeni nazw daną nazwę i przypisuję tej nazwie dany obiekt. Przykład:
x = 5
znaczy to, że tworzę "nazwę" x i przypisuję jej obiekt 5, na która ta
nazwa teraz wskazuje.
W pythonie są dwa rodzaje obiektów: "mutable" i "immutable". Wartość
obiektu "mutable" może się zmienić, natomiast wartość obiektu
"immutable" nie może się zmienić. Integer na przykład jest obiektem
"immutable", z czego wynika kilka ciekawych właściwości np.
y = x
(Teraz y wskazuje na ten sam obiekt co x czyli na 5)
x = 3
(Teraz x nie może już wskazywać na obiekt 5, ponieważ wartości obiektu 5
nie można zmienić. x wskazuje teraz na nowo utworzony obiekt 3; y
natomiast w dalszym ciągu wskazuje na obiekt 5)
Dlatego właśnie x = 3, a y = 5
Przejdę teraz do obiektów "mutable". Ich wartość może ulec zmianie.
Takim obiektem jest np. lista czy mapa (nie znam polskiego odpowiednika
wyrazu - może jest właśnie taki :P ). Do listy można dodawać obiekty i
można je usuwać. Jak widzimy określenie "mutable" jest bardzo trafne ;).
Zobaczmy:
a = [ 1, 2, 3 ]
b = a
(b wskazuje na ten sam obiekt co a, czyli na listę)
a.append( 4 )
(do a dodajemy obiekt 4)
Co się dzieje z b? b dalej wskazuje na ten sam obiekt co a! Ta sytuacja
ma miejsce ponieważ listę można zmienić i dodać do niej obiekt 4. Nie
musi już być tworzony nowy obiekt bo stary jest całkiem OK :).
A co jeśli potrzebujemy kopię listy a? Oczywiście po to jest "slicing":
b = a[:]
Wracając do mojego problemu...
Mam pewną rozbudowaną mapę i potrzebuję przekazać pewne elementy do
funkcji aby zmienić te elementy.
Przychodzą mi na myśl dwa rozwiązania: aby przekazać do funkcji
"referencję" do danego elementu mapy można:
1) przekazać do tej funkcji nazwę mapy i listę kluczy (lub najbardziej
zagłębiony element będący jeszcze listą lub mapą i klucz); następnie
utworzyć jakąś mała funkcję, która mając te dane zwróci odpowiedni obiekt
2) utworzyć funkcję "w biegu" (lambda), która zwróci nam odpowiedni
obiekt i ją przekazać do naszej głównej funkcji
Mam nadzieję, że moje rozumowanie jest poprawne. Jeśli nie jest lub
znacie lepsze sposoby na osiągnięcie tego samego efektu, proszę o
poprawienie mnie.
Pozdrawiam, kurcze