吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1296|回复: 1
收起左侧

[Python 转载] 【笔记】参数的传递

[复制链接]
cccyyys 发表于 2021-6-15 11:05
参数的传递
概念:函数的参数传递本质上就是:从实参到形参的赋值操作。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不相同。
好了,写完了,如果有发现什么错误请及时联系我改正,谢谢

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zxsbk 发表于 2021-6-17 16:45
函数中难理解的地方
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表