本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Python
函数参数引用(传值
or
传址)
copy
和
deepcopy
2017/06/30
0
博文结构:
1
、传值、传址的概念和区别
2
、
python
参数传递
的方式
3
、
copy
和
deepcopy
的使用
4
、
python
的数据存储方式
传值、传址的概念和区别:传值:被调函数局部变量改变不会影响主调函数局部
变量
传址:被调函数局部变量改变会影响主调函数局部变量
传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址
(相当于指针)
。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局
变量是否相应改变,用传值传入的参数是不会改变的,用传址传入就会改变。
a=1def f(b): b=2 return bf(a)print a 2 1
在这段代码里面,首先声明
a
的值为
1
,把
a
作为参数传入到函数
f
里面,函数
f
里面对
b
重新赋值为
2
,如果是传值的形式传入
a
的话,
a
的值是不会变的,依然为
1
,如果以传址的形式(但是在
python
中这个不
是程序员能决定的)传入
a
,
a
就会变成
2
。这个就是传值和传址的区别。
python
参数传递的方式
Python
是不允许程序员选择采用传值还是传址的。
Python
参数传递采用的肯定是
“
传对象引用
”
的方式。实际上,这种方式相当于传值和传址
的一种综合。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的
原始值
——
相当于传址。如果函数收到的是一个不可变对象(比如数字、字符或者
元组)的引用(其实也是对象地址!!!)
,就不能直接修改原始对象
——
相当于传
值。
因此
python
的传值和传址是比如根据传入参数的类型来选择的
传值的参数类型:数字,字符串,元组(
immutable
)
传址的参数类型:列表,字典(
mutable
)
a=1def f(b): b=b+1 return bf(a)print a 2 1
这段代码里面,因为
a
是数字类型,因此
是传值的方式,
a
的值并不会变,输出为
1
。
a=[1]def
f(b):
b[0]+=1
return
bf(a)print
a
[2]
[2]
这段代码里面,因为
a
的类型是列
表,因此是传址的形式,
a[0]
的值会改变,输出为
[2]
。