Modyfikacja listy w innej funkcji

0

Cześć!
Mam taką sytuację:

def zmiana_elementu(tab):
    tab[0] = 4

def zmiana_przez_tworzenie_kopii(tab):
    tab = tab[2:]
    tab = [4, 5, 6]

def tablica():
    tab = [1, 2, 3]
    zmiana_elementu(tab)
    print(tab)
    zmiana_przez_tworzenie_kopii(tab)
    print(tab)
tablica()

wynikiem wykonania tego programu będzie:

[4, 2, 3]
[4, 2, 3]

Jak zrobić tak, żeby przekazywać do funkcji listę, a następnie po jej nazwie zmieniać ją do woli? Kojarzyło mi się że w Pythonie przekazujemy wszystko przez referencje, więc gdy robię taką operację

tab = [4, 5, 6]

to chyba tworzę zmienna tab lokalnie w funkcji zmiana_przez_tworzenie_kopii
Jak zmieniać listę w funkcji do woli?

EDIT:
Jedynym obejściem tego problemu jest zwracanie nowej listy?

0

Modyfikujesz kopie (bo sobie kopie zrobiles) no to oryginal pozostanie niezmieniony

0

No to gdybym chciał zrobić np

def zamien_na_srodek(tab):
    tab = tab[3:6]

to da się to zrobić bez zwracania listy?

0

Nie znam sie na pytongu ale podobno tak:

# Removes elements from index 1 to 3
del listOfnum[1:4]

Ergo usuwasz z lewej strony i potem z prawej strony. Pewnie da sie lepiej.

4

Kojarzyło mi się że w Pythonie przekazujemy wszystko przez referencje

To nie jest taka referencja jak w C++ (int& i). Wszystko jest przekazywane przez wartosc ale wartoscia jest referencja. W zasadzie to wskaznik bez arytmeki wskaznikowej.

Czy to cos wyjasnia? Czy jeszcze gorzej? :D

1

@Suchy702:

def zamien_na_srodek(tab):
    tab[0:] = tab[3:6]
0

@stivens:
robiąc

tab = [1, 2, 3] 

to tab jest referencja do [1, 2, 3] (gdzies tam w pamieci), tak?

1

Jak w tej funkcji zmiana_przez_tworzenie_kopii przypisałeś do zmiennej tab jakąś wartość, to teraz ta zmienna wskazuje na tą wartość, a ta poprzednia czyli lista, będzie niezmieniona.
Jednak jak przypiszesz coś do elementów tej listy, wtedy się zmieni oryginalna lista czyli jakbyś chciał zmienić na [4,5,6] to dajesz

tab[:] = [4, 5, 6]
0

@Suchy702:

Suchy702 napisał(a):

@stivens:
robiąc

tab = [1, 2, 3]

to tab jest referencja do [1, 2, 3] (gdzies tam w pamieci), tak?

Jak dasz tab = [1, 2, 3] to w pamięci się tworzy lista [1, 2, 3] i zmienna tab na nią wskazuje. Jak dasz tab2 = tab to będzie wskazywało na tą samą listę i jak zmienisz tab np. metodą .append() to zmieni się także `tab2*. W Pythonie to nie jest tak, że zmienna to takie pudełko do którego coś wrzucasz, tylko bardziej "wskazywacz" (pewnie jest na to lepsza nazwa :D) - we Fluent Pythonie to ładnie tłumaczy autor

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