Objekto reikšmės keitimas

C
  • 27 Lie '10

Sveiki, turiu tokią problemą, kai gaunu objektą ir pakeičiu to objekto kažkokį lauką, pakeitimas vėliau neišlieka, tai yra reikšmė pakeičiama ne pagal adresą, o tiesiog local kažkokia kopija, pvz (2.6 python):

#!/usr/bin/evn python

class A:
    def __init__(self, name):
        self.name = name
        self.value = 0

class B:
    def __init__(self):
        self.listofa = []

    def geta(self, name):
        for a in self.listofa:
            if a.name == name:
                return a

if __name__ == "__main__":
    b = B()
    b.listofa.append(A("first"))
    a = b.geta("first")
    print a.value
    a.value = 1
    c = b.geta("first")
    print a.value

ir output'ą gaunu tokį:

0
1

kai norėčiau gauti vienodą... Gal kas žino kaip pakeisti reikšmę po rodykle, ar kaip čia pavadinus..?

C
  • 27 Lie '10

My bad, praleidau eilutę, kur pakeičiu.. deja su simple variantu viskas gerai, o va, kur man reikia, ten jau neveikia kažkodėl..

D
  • 27 Lie '10

Pirmiausia, kodėl tu tiesiog nenaudoji žodynų?

>>> b = {}
>>> b['first'] = 1
>>> b['first']
1
>>> b['first'] = 0
>>> b['first']
0
>>>

Labai jau nepitoniškas tavo kodas atrodo.

O jei jau žiūrėti į tavo kodą, tai vistiek neaišku kodėl turėtų rodyti vienodas reikšmes? Juk objektas tai tas pats?

Galbūt tau reikia deepcopy http://docs.python.org/library/copy.html, bet nesu tikras.

C
  • 27 Lie '10

Na man kaip tik reikėjo, kad rodytų vienodai, o gaudavosi, kad pakeičiu reikšmę, tada vėl paimu objektą, o reikšmė senoji. Radau savo klaidą, tai šioj vietoj viskas gerai.

O dėl žodynų, tai čia supaprastintą variantą parodžiau, nes man reikia ir metodų ir šiaip su klasėm man paprasčiau, su žodynu labai lengva pasimesti, kai atsiranda daug skirtingų laukų.

Manau paprasčiau taip:

class A:
  key = value
class B:
  setOfA
class C:
  setOfB

Negu kad:

{c1:{b1:{a1:{somekey:somevalue},a2:{anotherkey:val}}, b2:{a3:{}}}}

čia tik dėl vaizdo, dėl uždarančių skliaustų galėjau jau pasimesti, bet esmė manau aiški, ką norėjau pasakyti

D
  • 27 Lie '10

@cassel rašė:

{c1:{b1:{a1:{somekey:somevalue},a2:{anotherkey:val}}, b2:{a3:{}}}}

čia tik dėl vaizdo, dėl uždarančių skliaustų galėjau jau pasimesti, bet esmė manau aiški, ką norėjau pasakyti

Formatavimas padėtų šioje vietoje. Bet tiek to. Nesigilinsiu Galbūt kaip darai tikrai geriau, nors stipriai abejoju.