2017-04-04 113 views
7

在這個問題中,對於Python來說比較新,我可能會使用一些不正確的術語,並會顯示誤解 - 這是我爲什麼在這裏。Python。參數和返回值

我正在學習Python函數,並試圖確保我理解變量是如何傳遞和返回的。

我寫了這個平凡函數在

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

    NN.sort() 
    print (NN) 

    return (w) 

我已經賦值給一個列表

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

然後我envoke功能

func_sort_list(unsort_letters) 

和列表中的項目進行排序得到結果

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' 

然後,執行後,如果我顯示我最初傳遞給函數的變量的內容,我得到

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

這是我想要的結果。

以下是關於發生了什麼事的解釋正確,所以在編寫函數時我可以感覺更安全一些?

  1. unsort_letters,['q','w','e',...]的原始值是「global」嗎?

  2. 通過調用func_sort_list(unsort_letters)我已經將unsort_letters的地址/指針傳遞給func_sort_list?

  3. NN是函數的變量「local」,但它包含指向傳入變量的指針/地址,並且由於列表可變,函數內的unsort_letters的內容將被更改?

這使我:

  • 是否有過當我不能改變函數內傳遞的參數的內容的情況下,我必須寫的東西如下所示?

    def func_return_only(input_parm): 
        result_var = << some processing on input_parm goes here>> 
    
    return (result_var) 
    
  • 這我倒要envoke如下得到在var_s返回值的值。

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

    +0

    [本示例](http://stackoverflow.com/documentation/python/228/functions/2920/argument-passing-and-mutability)在文檔中很好地解釋了這個問題。 – user2314737

    +0

    感謝您的鏈接。讚賞。 –

    回答

    6

    你的心智模式非常正確。但是,您不應該擔心Python是「按值傳遞」還是「按引用傳遞」。您必須瞭解Python中的賦值如何工作。 This是最好的資源。要知道的最重要的事實是,分配從不復制數據

    一旦你理解了賦值,你唯一需要知道的就是函數參數是通過賦值傳遞的。

    當你調用你的函數是

    NN = unsort_letters 
    

    您在unsort_letters傳遞作爲參數出現這種情況隱含的第一件事。您將另一個名稱(NN)分配給該參數 - 就是這樣,沒有數據被複制。

    是否有過當的時候無論你傳遞是不可改變的,我不能改變功能

    是,內傳遞的參數的內容的情況。例如,整數沒有方法來更新它們的值,所以你不能在函數體(或其他地方)中對它們進行變異。

    然而,重要的是要注意,Python在賦值和參數傳遞期間不會以不同方式處理可變類型和不可變類型。你不能改變不可變類型,因爲它們沒有變異方法。

    +2

    引用「你傳入unsort_letters作爲參數,你爲該參數指定了另一個名稱(NN) - 就是這樣,沒有數據被複制。」這是完全合理的。感謝您的YouTube鏈接。 –

    +0

    @CliveLong沒問題,謝謝你的好問題。 – timgeb