Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności:
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Lista jako element listy  (Przeczytany 767 razy)
« : 08:40 13/01/18 »
miroow Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 2


#Witam,

#Nie rozumiem działania krótkiego programu, który stworzyłem. Celem było stworzenie listy #z zagnieżdzonymi listami (jako rekordy listy). Program się pyta ile elementów ma mieć #zagnieżdzona lista oraz ile tych elemntów ma zawierać.

list_null_x=[]
list_null=[]
how_many_x=int(input("Provide amount of elements in nested list"))
how_many_y=int(input("Provide amount of elements"))
for i in range(how_many_x):
    list_null_x.append("_")

for c in range (how_many_y):
    list_null.append(list_null_x)

print (list_null

#Wszystko działa OK, ALE JAK CHCE ZMIENIC POLE W zagnieżdzonej liscie np:

list_null[1][1]="X"

To mam taki wynik:

[['_', 'X', '_'], ['_', 'X', '_'], ['_', 'X', '_']]

Dlaczego X mi wstawił w każdym pierwszym polu, a nie tylko jak chciałem w rekordzie pierwszym.

Pozdrawiam, i z góry dziękuję za rady.


PS. Poniżej próbowałem z klasami i jest ten sam rezultat.

class Main_List(object):

    def create_list(self, x, y):
        self.list_x=[]
        self.list_null=[]
        self.x=x
        self.y=y
        for i in range(self.x):
            self.list_x.append("_")

        for i in range(self.y):
            self.list_null.append(self.list_x)


    def show_matrix(self):
        for i in self.list_null:
            print((i))
        return self.list_null


    def put_star(self,x0,y0):
        self.x0=x0
        self.y0=y0
        self.list_null[self.x0][self.y0]="*"
        return self.list_null






Zapisane
« Odpowiedz #1 : 12:52 13/01/18 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 42
Płeć: Mężczyzna
Wiadomości: 336


Odpowiedź jest stosunkowo prosta.
#1.
Kod
a = [ [ None ] * 2 ] * 2
a[0][1] = 1
print(a)

Referencja.

Kod
a=[[None, None], [None, None]]
a[0][1]=1
print(a)
[[None, 1], [None, None]]

Brak referencji.

Tworząc obiekt w liście i mnożąc te listę (nie będącą zagnieżdżoną) w celu redukcji zużycia pamięci, interpreter tworzy referencje. (W dużym uproszczeniu).
Gdy podajemy listę, do dodania jako element listy, dzieje się dokładnie to samo.
Żeby temu zapobiec, musisz wykonać deepcopy().
https://docs.python.org/2/library/copy.html
Czyli dodając listę jako elementy, dodaj jej deepcopy zamiast standardowej w tym przypadku referencji Uśmiech
Zapisane

Python 3.5.2 / Mint
« Odpowiedz #2 : 13:06 13/01/18 »
miroow Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 2


Dzięki! Doceniam bardzo skrupulatną odpowiedź.
Zapisane
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2018 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot