16 | 值传递,引用传递or其他,Python里参数是如何传递的?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值