Python 函数参数传值 or 传引用

Python 有且只有一种函数参数传递方式,那就是传引用

python 函数内部的形参实际上是传入的实参拷贝(传入的实参实际上也是一个引用,指向内存中的某一个对象,因此形参实参实际上都指向同一个元素)

基于上一条,可以得出,函数内部无法改变形参所指向的对象,因为实参只是形参的一个拷贝

tip: Python变量类似于标签/引用,指向内存中对象,变量间的赋值实际上只是复制引用,这也称为浅拷贝.

变量

看下面实例

1
2
3
4
5
6
7
8
9
10
11
12
a = [1,2,3]
b = a
b.append(4)

print('{0:^18}{1:^18}'.format('a','b'))
print('{0:^18}{1:^18}'.format( str(a),str(b) ))

a1 = (1,2,3)
c1 = b1 = a1
c1 += b1
print('{0:^18}{1:^18}{2:^18}'.format('a1','b1','c1'))
print('{0:^18}{1:^18}{2:^18}'.format(str(a1), str(b1), str(c1) ))

在线演示

结果

结果

由上面结果可知:

  • b = a 实际上复制的上引用,其指向同一个对象,因此对a进行操作,会同时影响b——–这是对于可变对象而言
  • 对于不可变对象 ,c1 += b1,实际上是新建一个c1+b1的对象,并将c1指向该对象.

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = [1,2,3]
b = [3,4,5]
def f(a,b):
a += b
return a
c = f(a,b)
print('{0:^18}{1:^18}{2:^18}'.format('a','b','c'))
print('{0:^18}{1:^18}{2:^18}'.format( str(a), str(b), str(c) ))

a1 = (1,2,3)
b1 = a1
c1 = f(a1,b1)
print('{0:^18}{1:^18}{2:^18}'.format('a1','b1','c1'))
print('{0:^18}{1:^18}{2:^18}'.format(str(a1), str(b1), str(c1) ))

在线演示

结果

运行效果

  • 从上面可以看出,对于可变对象,函数内部的操作可能会影响外部传入的实参,但是不能改变外部实参所指向的对象
  • 对于不可变对象,无法改变实参所指向的对象,因此,其类似于传值--函数参数传递方式

本文标题:Python 函数参数传值 or 传引用

文章作者:定。

发布时间:2017年6月22日 - 21时06分

本文字数:1,592字

原始链接:http://cocofe.cn/2017/06/22/Python 函数参数传值 or 传引用/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。