修改参数的python函数
函数add没有返回值。我了解到,只有列表这样的可变对象才能进行更改。但为什么该人遗漏了报税表?有没有退货都可以。为什么?这与C++有很大的不同。修改参数的python函数,python,Python,函数add没有返回值。我了解到,只有列表这样的可变对象才能进行更改。但为什么该人遗漏了报税表?有没有退货都可以。为什么?这与C++有很大的不同。 谢谢add()对a进行了变异,而不是重新绑定,因此更改会显示在原始对象中。python中的所有内容都是通过引用传递的,但整数,字符串等是不可变的,因此当您更改它时,您将创建一个绑定到局部变量的新字符串,以便传递给函数的变量不会更改。 然而,列表和dict是可变的——因此,如果您更改它们,则不会创建新对象,因此更改也会影响调用者作用域中的变量 但是为什么
谢谢
add()
对a
进行了变异,而不是重新绑定,因此更改会显示在原始对象中。python中的所有内容都是通过引用传递的,但整数,字符串等是不可变的,因此当您更改它时,您将创建一个绑定到局部变量的新字符串,以便传递给函数的变量不会更改。
然而,列表和dict是可变的——因此,如果您更改它们,则不会创建新对象,因此更改也会影响调用者作用域中的变量
但是为什么这个人省略了这个词呢
返回?有无退货
很好。为什么?这太不一样了
从C++ +< /P>
完全不——C++与所有意图和目的相同!只需在C++版本中,通过< C++ >代码> >代码> >代码> A/>代码>,通过引用引用“代码< > STD::vector < /代码>——所有的意图和目的,这就是Python <代码> Addio/<代码>所做的,以C++术语看。
用Python术语来说,当一个函数“从末尾掉下来”时,这与它在该点执行
时返回None
完全相同。在这种情况下,当函数总是以“从结尾处掉下来”时避免出现冗余代码< >返回NO.< /C++ >语句(不要在多余的装饰中浪费像素和屏幕空间)。
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_val()
会导致原始向量
保持不变,因为它是按值传递的。但是,将向量
传递到add_ref()
会导致原始向量
中的值发生变化,因为它是通过引用传递的
在Python中,所有内容都是通过引用传递的。然而,许多内置类型(str
,tuple
,int
,float
,等等)是不可变的。这意味着对这些类型执行的任何操作都会导致在当前范围内使用新值绑定新变量。对于可变类型(<代码>列表< /COD>,<代码> DICT < /Cube >等),最终与在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