Рассмотрим следующую программу 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
vector
пропусканием в add_val()
результаты в исходном vector
остается неизменным, так как она передается по значению. Однако передача в add_ref()
приводит к изменению значений внутри оригинала vector
, поскольку он передается по ссылке.
В Python все передается по ссылке. Однако многие встроенные типы (str
, tuple
, int
, float
и т. Д.) Являются неизменными. Это означает, что любая операция, выполняемая этими типами, приводит к тому, что новая переменная привязана в текущей области с новым значением. Для изменяемых типов (list
, dict
и т. Д.) Вы получаете ровно тот же результат, что и передача параметра по ссылке в C++.