2010-08-19 56 views
0
def add(a,b): 
    for i in range(len(a)): 
     a[i] = a[i] + b 

def main(): 
    amounts = [100,200] 
    rate = 1 
    add(amounts,rate) 
    print amounts 

main() 

函數add沒有返回值。我讀到,只有像列表這樣的可變對象才能使用這些更改。但爲什麼這個人省略了回報?有或沒有回報是好的。爲什麼?這與C++非常不同。修改參數的python函數

感謝

回答

7

但是爲什麼這個人省略了 回報?有或沒有返回 是好的。爲什麼?這與C++的 差別很大。

一點都沒有 - 對於所有的意圖和目的,它與C++完全相同!在C++版本中,只需製作一個void add並將其參數a(比如std::vector<int>)作爲參考傳遞給所有意圖和目的,這就是Python C++ add正在做的事情,用C++術語來看。

用Python語言說,當一個函數「落底」剛好是,就好像它在那時執行return None一樣。在這種情況下(當功能總是以「下降結束」結束時),以避免多餘的return None語句(不要浪費像這種冗餘裝飾中的像素和屏幕空間)。

1

add()變異a,而不是重新綁定它,所以改變原來的對象顯示出來。

1

一切都通過引用傳遞給python,但整數,字符串等是不可變的,所以當你改變它時,你創建一個新的綁定到本地變量,所以傳遞給函數的變量不會改變。然而,列表和字符串是可變的 - 所以如果你改變它們,沒有創建新的對象,並且由於這個改變也會影響調用者範圍中的變量。

0

考慮下面的C++程序:

#include <vector> 
#include <iostream> 

void add_val(std::vector<int> addTo, int addThis) 
{ 
    for(std::vector<int>::iterator it = addTo.begin(); it!=addTo.end(); ++it) 
    { 
     *it += addThis; 
    } 
} 

void add_ref(std::vector<int>& addTo, int addThis) 
{ 
    for(std::vector<int>::iterator it = addTo.begin(); it!=addTo.end(); ++it) 
    { 
     *it += addThis; 
    } 
} 

int main() 
{ 
    std::vector<int> myVector; 

    myVector.push_back(1); 
    myVector.push_back(2); 
    myVector.push_back(3); 

    add_val(myVector, 3); 

    std::cout<<"After add_val"<<std::endl; 
    for (std::vector<int>::iterator it = myVector.begin(); it!=myVector.end(); ++it) 
    { 
     std::cout<<*it<<" "; 
    } 

    std::cout<<std::endl; 

    add_ref(myVector, 3); 

    std::cout<<"After add_ref"<<std::endl; 
    for (std::vector<int>::iterator it = myVector.begin(); it!=myVector.end(); ++it) 
    { 
     std::cout<<*it<<" "; 
    } 
    std::cout<<std::endl; 

    return 0; 
} 

程序輸出:

After add_val 
1 2 3 
After add_ref 
4 5 6 

跑過vectoradd_val()結果在保持不變的原始vector,因爲它是由值來傳遞。但是,將vector傳遞給add_ref()會導致原始vector內的值發生更改,因爲它通過引用傳遞。

在Python 中的所有內容都通過引用傳遞給。然而,許多內建類型(str,tuple,int,float等)是不可變的。這意味着您對這些類型執行的任何操作都會導致使用新值綁定到當前作用域的新變量。對於可變類型(list,dict等),最終得到的結果與在C++中通過引用傳遞參數的結果相同。