Smevios
#python #naukaprogramowania
Pytanie co do atrybutu klasy, który jest typem 'referencyjnym'

https://pastebin.com/cBJgzzti

Linijka 17, czemu zmiana dotyka wszystkich instancji klasy + definicji klasy samej w sobie gdzie w linijce 9 zmiana dotyczy tylko atrybutu danego obiektu (bez zmian w innych instancjach + definicji klasy)
2
  • Najlepsze
  • Wszystkie komentarze
Smevios
2
m_bielawski
m_bielawski
typem 'referencyjnym'


@Smevios: tak tylko wtrącę, że w pythonie nie ma czegoś takiego jak "przekazywanie przez referencję". Dobra prezka na ten temat:
2
Smevios
@Kiro plz? :<
1
filozof900
@Smevios: jak juz sam zauwazyles, jest to typ referencyjny wiec wszystkie klasy posiadaja referencje do tego samego obiektu (listy). dlatego deklarowanie takich zmiennych nie jest zalecane, jezeli chcialbys zrobic sobie liste np opcji wtedy lepiej zrobic tuple
1
l.....i
l.....i
>>> l = [[]] * 5
>>> l
[[], [], [], [], []]
>>> l[0].append(1)
>>> l
[[1], [1], [1], [1], [1]]
1
Kiro
@Smevios: Hm, akurat nie ma tutaj znaczenia "typ referencyjny". O co chodzi można wywnioskować po tym co widać w linii 9. Ogólnie pola definiowane w ciele klasy (nie w metodzie, na selfie), należą do klasy. W przeciwieństwie do wielu języków, nie są one "dziedziczone/kopiowane" przez instancje tej klasy, a ich wartość nie jest wartością domyślną (wtedy fakt że to jest lista miałby znaczenie).

W uproszczeniu: po linii 5, instancje a
1
Smevios
@Kiro: @m_bielawski: dziękóweczka!
1
sokytsinolop
taktycznie ( ͡° ͜ʖ ͡°)
0
sokytsinolop
@Smevios: ah to self ;) dobrze wiedzieć jak to działa ;)
0
Smevios
@sokytsinolop: self jest rozwiazaniem problemu, a nie jego przyczyna anyway
0
sokytsinolop
@Smevios: wiem chodziło mi o to że ja self zawsze daje, dlatego nie napotkałem an ten błąd i w tym co napisałem chodziło mi że teraz będę w stanie przewidzieć co powoduje dany bład w razie gdybym jednak kiedyś tego self zapomniał
0
c.....i
0