1. 什么是值传递和引用传递
值传递,通常就是拷贝参数的值,然后传递给函数里的新变量,这样,原变量和新变量之间互相独立,互不影响。
#include <iostream>
using namespace std;
// 交换 2 个变量的值
void swap(int x, int y) {
int temp;
temp = x; // 交换 x 和 y 的值
x = y;
y = temp;
return;
}
int main () {
int a = 1;
int b = 2;
cout << "Before swap, value of a :" << a << endl;
cout << "Before swap, value of b :" << b << endl;
swap(a, b);
cout << "After swap, value of a :" << a << endl;
cout << "After swap, value of b :" << b << endl;
return 0;
}
Before swap, value of a :1
Before swap, value of b :2
After swap, value of a :1
After swap, value of b :2
这个swap()函数,把a和b的值拷贝给了x和y,然后再交换x和y的值。这样一来,x和y的值发生了改变,但是a和b不受其影响,所以值不变,这种方式,就是我们所说的值传递。
引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内存地址。如果改变了其中任何一个变量的值,那么另外一个变量也会相应地随之改变。
void swap(int& x, int& y) {
int temp;
temp = x; // 交换 x 和 y 的值
x = y;
y = temp;
return;
}
结果:
Before swap, value of a :1
Before swap, value of b :2
After swap, value of a :2
After swap, value of b :1
原变量 a 和 b 的值被交换了,因为引用传递使得 a 和 x,b和y一模一样,对x和y的任何改变必然导致发a和b的相应改变。
2.Python变量及其赋值
a = 1
b = a
a = a + 1
首先将1赋值于a,即a指向这个对象,流程图
接着b=a则表示,让变量b也同时指向1这个对象,这里注意,python里的对象可以被多个变量所指向或引用。
最后执行a= a+1,需要注意的是python的数据类型,例如:整型、字符串等,是不可变的。所以a = a+1,并不是让a的值增加1 ,而是表示重新创建了一个新的值为2的对象,并让指向它。但b仍然不变,仍然指向1这个对象。因此结果为:
同时,指向同一个对象,也并意味着两个变量就被绑定到了一起,如果你给其中一个变量重新赋值,并不会影响其他亦是的值。
l1 = [1, 2, 3]
l2 = l1
l1.append(4)
l1
[1, 2, 3, 4]
l2
[1, 2, 3, 4]
同样的,我们首先让列表l1和l2同时指向了[1,2,3]这个对象。
由于列表是可变的,所以l1.append(4)不会创建新的列表,只是在原列表的末尾插入了元素4,变成[1,2,3,4].由于l1和l2同时指向这个列表,所以列表的变化会同时反映在l1和l2这个变量上,那么,l1和l2的值同时变成了[1,2,3,4]
python里的变量可以被删除,但是对象无法被删除。
del删除了这个变量,从此无法访问,但是对象[1,2,3]仍然存在。pyhton程序运行时,其自带的垃圾回收系统会跟踪每个对象的引用。如果[1,2,3]除了1,还在其他地方被引用,那就不会被回收,反之则会被回收。
比如:
def my_func1(b):
b = 2
a = 1
my_func1(a)
a
1