2017-04-04 30 views
7

Będąc stosunkowo nowym w Pythonie w tym pytaniu, mogę używać niepoprawnej terminologii i będę wyświetlał nieporozumienia - i dlatego jestem tutaj.Python. Parametry i zwracane wartości

Studiuję funkcje Pythona i próbuję upewnić się, że rozumiem, w jaki sposób zmienne są przekazywane i zwracane.

Pisałem tę banalną funkcję sortowania pozycji na liście

def func_sort_list(NN): 
    for w in NN: 
     print (w, type(w)) 

    NN.sort() 
    print (NN) 

    return (w) 

mam przypisanej wartości do listy

unsort_letters=['q','w','e','r','t','y'] 

Potem envoke funkcję

func_sort_list(unsort_letters) 

i uzyskaj wynik

q <class 'str'> 
w <class 'str'> 
e <class 'str'> 
r <class 'str'> 
t <class 'str'> 
y <class 'str'> 
['e', 'q', 'r', 't', 'w', 'y'] 
'y' 

następnie, po wykonaniu, gdybym wyświetlić zawartość zmiennej pierwotnie przekazywana do funkcji otrzymuję

unsort_letters 
['e', 'q', 'r', 't', 'w', 'y'] 

co jest wynikiem chcę.

Czy następująca interpretacja tego, co się wydarzyło, jest poprawna, więc czuję się trochę bezpieczniej podczas pisania funkcji?

  1. pierwotnej wartości unsort_letters, [ 'q', 'w', 'e', ​​...], jest "globalny"?

  2. Przez wywołanie func_sort_list (unsort_letters) Przekazałem adres/wskaźnik unsort_letters do func_sort_list?

  3. NN jest zmienną "lokalną" dla funkcji, ale zawiera wskaźnik/adres do przekazanej zmiennej, a ponieważ lista jest zmienna, zawartość unsort_letters zmienia się w funkcji?

Co prowadzi mnie do:

  1. Czy kiedykolwiek okoliczność, kiedy nie mogę zmienić zawartość przekazany parametr w funkcji i muszę coś napisać jak poniższe?

    def func_return_only(input_parm): 
        result_var = << some processing on input_parm goes here>> 
    
    return (result_var) 
    

Które muszę envoke w następujący sposób, aby dostać się w wartości zwracanych wartości w var_s.

var_s = func_return_only(<< my input variable or value>>) 

?

+0

[Ten przykład] (http://stackoverflow.com/documentation/python/228/functions/2920/argument-passing-and-mutability) w dokumentacji dokładnie wyjaśnia problem. – user2314737

+0

Dziękuję za link. Doceniony. –

Odpowiedz

6

Twój model mentalny jest prawie poprawny. Nie powinieneś się jednak martwić, czy Python to "przekazywanie według wartości" czy "przekazywanie przez odniesienie". Musisz nauczyć się, jak działa przypisanie w Pythonie. This udostępnia najlepsze zasoby, aby to zrobić. Najważniejszym faktem jest to, że przypisanie nigdy nie kopiuje danych.

Gdy zrozumiesz przypisanie, jedyne, co musisz wiedzieć, to to, że parametry funkcji są przekazywane przez przypisanie.

Pierwszą rzeczą, która dzieje się niejawnie podczas rozmowy czynność jest

NN = unsort_letters 

Przeszedłeś w unsort_letters jako argumentu. Do tego argumentu przypisujesz inną nazwę () - i to wszystko, żadne dane nie są kopiowane.

Czy kiedykolwiek okoliczność, kiedy nie mogę zmienić zawartość przekazany parametr w funkcji

Tak, kiedy cokolwiek przekazać w jest niezmienna. Na przykład liczby całkowite nie mają żadnych metod aktualizowania ich wartości, więc nie można ich zmutować w treści funkcji (ani nigdzie indziej).

Należy jednak pamiętać, że Python nie traktuje zmiennych i niezmiennych typów w inny sposób podczas przypisywania i przekazywania parametrów. Po prostu nie można mutować niezmiennych typów, ponieważ nie mają na nich metod mutacji.

+2

Cytat "Podałeś argument unsort_letters jako argument, przypisujesz do niego inną nazwę (NN) - i to wszystko, żadne dane nie są kopiowane." To ma sens. Dziękujemy za link do Youtube. –

+0

@CliveLong nie ma problemu, dzięki za dobre pytanie. – timgeb