self проблем

  1. Здравейте, искам да ползвам лист от Base елементи в класа Der. Когато използвам функция от Base за 1 елемент от списъка в Der ( self.problem[position].change( '111111') ), тя се вика за всички елементи на Bаsе ( не съм сигурен какво точно става затова написах и примера).

    Искам когато напиша self.problem[position].change( '111111') да се променя само problem[position] елемента. Надявам се да ме разбрахте :)

    class Base:

    def __init__(self,p,l=[]):
        self.__list = l
        self.p = p
    
    def change(self,li):
        self.__list.append(li)
    def show(self):
        return self.__list
    

    problem=[Base(1),Base(2)]

    class Der:

    def __init__(self):
        self.problem = problem
    
    def changeDer(self,position,stoinost): # stoinost ili 
        self.problem[position].change( '111111')    #не работи
        #self.problem[position].__list = '111111'   #работи
    def showDer(self,position):
        return self.problem[position].show()
    
    
    >>> d = Der()
    
    >>> d.showDer(0)
    
    []
    >>> d.showDer(1)
    
    []
    >>> d.changeDer(0,'dsadsadasdas')
    
    >>> d.showDer(0)
    
    ['111111']
    >>> d.showDer(1)
    
    ['111111']  
    
  2. @Кирил, проблемът идва от self.__list = l в конструктора на Base. Написано по този начин, всичките Base обекти които създаваш ще гледат в паметта на едно и също място за техния си списък. Ако пробваш d.problem[0]._Base__list is d.problem[1]._Base__list ще видиш че това ще върне True. Така като използваш d.changeDer(0,'something'), наистина променяш желания списък, но тъй като същото място в паметта се използва и от другите елементи на d.problem, списъците на всичките елементи на d.problem ще се променят.

    Друго нещо за което някой ще те намрънка, е това че ползваш mutable обект като стойност по подразбиране в конструктора на Base. Ако използваш нещо immutable за стойност по подразбиране, например tuple, проблемът с еднаквата памет за списъците не е налице.

Трябва да сте влезли в системата, за да може да отговаряте на теми.