• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obiekty ze współdzieloną tablicą WTF?

Object Storage Arubacloud
0 głosów
111 wizyt
pytanie zadane 11 grudnia 2019 w Python przez Darven Użytkownik (860 p.)

Mamy klase, która ma zmienną x i tablice y. Mamy dwa obiekty tej klasy, jeśli nadamy jednemu wartość x to nie będzie miało to wpływu na drugi obiekt, co jest logiczne. Ale dlaczego podobnie nie działą to w przypadku tablicy?? Jeśli dodam do tablicy pierwszego obiektu jakiś element, to drugi obiekt też go dostaje. Dlaczego oba obiekty zachowują się, jakby współdzieliły między sobą tą samą tablice??

 

class A():
    def __init__(self, x = 0, y = [] ):
        self.x = x
        self.y = y



obiekt1 = A()
obiekt2 = A()

obiekt1.y.append(1) #dodawanie elementu do tablicy

print(obiekt1.y)
print(obiekt2.y) # po wyprintowaniu ten obiekt rowniez posiada element w tablicy a nie pownien

Jak zrobić, by obydwa obiekty miały swoje własne tablice?

1 odpowiedź

+1 głos
odpowiedź 11 grudnia 2019 przez adrian17 Ekspert (345,160 p.)
edycja 11 grudnia 2019 przez adrian17
 
Najlepsza

Ale dlaczego podobnie nie działą to w przypadku tablicy??

To nie jest kwestia tablic ani obiektów, tylko argumentów domyślnych funkcji.

In [1]: def f(argument=777): 
   ...:     return argument 

In [2]: f()
Out[2]: 777
In [6]: a = f()
In [7]: b = f()
In [8]: a is b
Out[8]: True

Tak naprawdę wartość domyślna to zawsze jest ten sam obiekt, więc wszystkie wywołania funkcji dzielą ten sam obiekt. Dlatego modyfikowanie tego samego obiektu jest widoczne wszędzie tak samo. Jeśli argument domyślny to liczba, to dzieje się to samo; po prostu to trudniej zaobserwować.

To jest faktycznie nieintuicyjne zachowanie argumentów domyślnych; w większości innych języków zachowuje się to tak, jak byś się spodziewał.

W każdym razie, zazwyczaj rozwiązuje się to tak:

def __init__(self, x=0, y=None):
    self.x = x
    if y is None:
         y = []
    self.y = y

 

Podobne pytania

0 głosów
1 odpowiedź 316 wizyt
pytanie zadane 10 września 2016 w Java przez nemezisso Użytkownik (860 p.)
0 głosów
1 odpowiedź 126 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez Jakub Śliż Użytkownik (940 p.)

92,592 zapytań

141,441 odpowiedzi

319,702 komentarzy

61,975 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...