python参数传递

2021-11-18  本文已影响0人  D_w

先以C++代码为例看看值传递,

#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 不受其影响,所以值不变。这种方式,就是我们所说的值传递。
若把上述例子中的swap()函数改为传递引用类型,则变为引用传递,所谓引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内存地址。如果改变了其中任何一个变量的值,那么另外一个变量也会相应地随之改变。

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

python变量赋值

l1 = [1, 2, 3]
l2 = l1
l1.append(4)
l1
[1, 2, 3, 4]
l2
[1, 2, 3, 4]
a = 1
b = a
a = a + 1
print(a)
print(b)
-----------------输出-------------
2
1

python函数的参数传递

Python 的参数传递是赋值传递 (pass by assignment),或者叫作对象的引用传递(pass by object reference)。Python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说,注意的是,这里的赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象。比如,我们来看下面这个例子:

def my_func3(l2):
  l2.append(4)

l1 = [1, 2, 3]
my_func3(l1)
l1
---------输出----------
[1, 2, 3, 4]

这个例子中,l1和l2都指向 [1, 2, 3],而这个列表可变,执行append后l1和l2的值都发生变化。再看下面的例子,l1的值没有改变

def my_func4(l2):
  l2 = l2 + [4]      # 创建了一个“末尾加入元素 4“的新列表,并让 l2 指向这个新的对象,此过程与l1无关

l1 = [1, 2, 3]
my_func4(l1)
l1
-----------输出-----------
[1, 2, 3]

上面的例子想要l1有所变化,就需要让my_func4方法返回运行结果,再赋值给l1

def my_func5(l2):
  l2 = l2 + [4]
  return l2

l1 = [1, 2, 3]
l1 = my_func5(l1)
l1
[1, 2, 3, 4]

改变变量和重新赋值的区别:

上一篇 下一篇

猜你喜欢

热点阅读