2010-08-19 101 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++中通过引用传递参数的结果相同。