Listy, słowniki, funkcje...

0

Witam! Kilka dni temu postanowiłem zacząć swoją przygodę z programowaniem. Ogarnąłem (albo też jeszcze nie) w Pythonie parę podstaw takich jak w temacie i próbuję się z tym bawić. Wymyśliłem program, którego fragment ma za zadanie utworzyć listę imion, które użytkownik będzie wpisywał, a następnie na podstawie tej listy utworzyć drugą listę ze słownikami, gdzie do jednego z kluczy jako przypisane wartości będą imiona z pierwszej listy.

imiona = []

"""wypelnienie pierwszej listy"""
imie = raw_input ("Podaj imie, zeby skonczyc napisz koniec: ")
while imie != "koniec":
    imiona.append(imie)
    imie = raw_input ("Podaj nastepne imie, zeby skonczyc napisz koniec: ")

"""skopiowanie pierwszej listy"""
slowniki = imiona

"""zamiana drugiej listy na slowniki"""
def zamiana(a):
    slowniki[a] = {
        'Imie': imiona[a],
        'Oceny': []
        }
    return slowniki[a]

print imiona
zamiana(0)
print imiona

Mam problem z trzema ostatnimi linijkami, czyli testowaniem dla jednej wartości. Przed wykonaniem funkcji pierwsza lista wyświetla się normalnie tak jak była wpisywana, zaś po jej wykonaniu zamienia się ona w listę słowników, mimo tego, że na pierwszej liście nie przeprowadzałem żadnej 'edycji'.
Czy ja popełniam jakiś błąd i czegoś nie przewidziałem, czy w ogóle mam jakieś złe założenia i dlatego program nie wykonuje tego co chcę? Bardzo proszę o pomoc i wyrozumiałość. Tak jak pisałem, to moje pierwsze dni z programowaniem, za uwagi "ale ty się nie znasz, każdy szanujący się programista rozklepałby to w 5 minut" dziękuję, bo mam tego świadomość :)
Pozdrawiam.

0

Taka operacja:
slowniki = imiona
Niczego nie kopiuje. Tworzysz referencje slowniki i pokazujesz nią na ten sam obiekt co imiona.
Wykonaj sobie:

x = [1,2]
y = x
x.append(3)
print(x)
print(y)
y.append(4)
print(x)
print(y)

i zobacz co się będzie działo. Python generalnie nie wykonuje kopii sam z siebie.
Musiałbyś tam explicite napisać na przykład: y = list(x) i wtedy wykona się płytka kopia (shallow copy) tej listy. Płytka kopia oznacza że elementy w liście nadal są tymi samymi obiektami!

0
import copy

a = ["dsfkj", "swfuh", "fewiofuh", "wg4gs", "fdsfeiu", "gibjcd"]
print "id(a)", id(a)

b = a
print "b = a", id(b), id(a) == id(b)

b = list(a)
print "b = list(a)", id(b), id(a) == id(b)

b = a[:]
print "b = a[:]", id(b), id(a) == id(b)

b = copy.copy(a)
print "b = copy.copy(a)", id(b), id(a) == id(b)

b = copy.deepcopy(a)
print "b = copy.deepcopy(a)", id(b), id(a) == id(b)
>>>python copy_pg.py
id(a) 27665912
b = a 27665912 True
b = list(a) 27669728 False
b = a[:] 27640936 False
b = copy.copy(a) 27672368 False
b = copy.deepcopy(a) 27640936 False

Tylko w pierwszym przypadku identity list a, b są równe, w pozostałych przypadkach b jest kopią listy a.

0

W porządku, myślałem, że "slowniki = imiona", to tak jak jak napisać np. "slowniki = 2", czyli po prostu przypisuję wartość nowej zmiennej, ale jak się domyślam, nie działa to w relacji zmienna->zmienna. Dzięki za wskazówki ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1