Zauważyłem (pozornie) dziwne zachowanie przy zadaniach, które doprowadziło mnie kilka razy do popełnienia błędów w programowaniu.Reguły przypisywania
Patrz poniższy pierwszy przykład:
>>> i = 0
>>> t = (i,)
>>> t
(0,)
>>> i += 1
>>> t
(0,)
Zgodnie z oczekiwaniami, wartość unikalnego elementu t
nie zmienia się, nawet po wartość i
została zwiększona.
Zobacz teraz następujące:
>>> l = [0]
>>> t = (l,)
>>> t
([0],)
>>> l[0] += 1
>>> t
([1],) # <- ?
Nie rozumiem dlaczego początkowe zera w t
jest obecnie jednym; gdybym zwiększany go z odniesieniem do t
...
>>> t[0][0] += 1
... ja rozumiem, że jest to wartość uległa zmianie, ale nie jest to przypadek w poprzednim przykładzie, gdzie tylko l
wyraźnie odwołuje przy inkrementacji.
Mam dwa pytania:
- Dlaczego tak jest?
- Czy istnieją specjalne zasady, o których powinienem wiedzieć?
Należy więc wiedzieć, czy ma do czynienia z obiektami zmiennymi (listami, zestawami itp.) Lub obiektami niezmiennymi (łańcuchy, liczby całkowite, krotki ...)? – michaelmeyer
Istnieje również fakt, że krotki są niezmienne; jeśli obiekt przechowywany w krotce był zmienny, ale nie implementował '__iadd__', operacja nadal nie działałaby; jednak z niestandardową metodą '__iadd__' (która modyfikuje' self'), robi to. – JAB
@doukremt Możesz modyfikować zmienny obiekt z dowolnego z jego odwołań (tylko operacje w miejscu, 'append',' extend', '+ ='), podczas gdy modyfikowanie obiektu niezmiennego zawsze zwraca nowy obiekt i wszystkie inne odwołania nadal wskaż stary obiekt. –