好友
阅读权限10
听众
最后登录1970-1-1
|
参数的传递
概念:函数的参数传递本质上就是:从实参到形参的赋值操作。Python中所有的赋值操作都是“引用的赋值”,所以Python中参数的传递都是“引用传递”,不是“值传递”。
参数的传递可分为:1、对“可变对象”的“写操作”。2、对“不可变对象”的“写操作”。
可变对象有:字典、列表、自定义的对象等。
不可变对象有:字符串、数字、元组、function等
一、传递可变对象
传递参数是可变对象时,实际传递的还是对象的引用,不会创建新的对象,而是可以直接修改所传递的对象。
[Python] 纯文本查看 复制代码 a = [10,20]
print(id(a))
print('*****************************')
def f(m):
print(id(m))
m.append(30)
print(m)
print(id(m))
f(a)
print(a)
结果为:2671809269376
*****************************
2671809269376
[10, 20, 30]
2671809269376
[10, 20, 30]
根据运行结果我们可以看出函数体运行完毕之后m的ID是不变的,而且m和a的ID全部是相同的,所以在传递可变对象是是可以在原对象基础上进行修改的,不会创建新的对象。函数体运行完毕之后又重新打印了一次a的值,与函数体运行之前的a结果不同,因为参数的传递都是“引用传递”,实际上是将[10,20]列表在计算机中的地址同样指向了m,也就是2671809269376,函数中m中已经增添了元素30,会在2671809269376地址上新增元素30,该地址的值就变成了[10,20,30],因此我们再次打印a时,会找到a变量的地址,也就是2671809269376,值就会变成[10,20,30]。
二、传递不可变对象
传递不可变对象时,实际传递的还是对象的引用,在“赋值操作”时,由于不可变对象不可修改,系统会创建一个新的对象。
[Python] 纯文本查看 复制代码 a = 300
print(id(a))
def f(m):
print(id(m))#与a的地址相同
m += 200 #由于a是不可变对象,进行赋值操作时,系统会创建一个新的对象m
print(id(m)) #m已经变成了新的对象
print(m)
f(a)
运行结果为:2592137382256
2592137382256
2592138325072
500
根据运行结果,在函数体进行从实参到形参的传递时,直接传递的是“300”这个对象,没有进行拷贝,此时m和a的地址相同,但在赋值操作中,由于a是不可变对象,系统已经创建了一个新的对象m,地址和之前的变量a不相同。
好了,写完了,如果有发现什么错误请及时联系我改正,谢谢 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|