20201022_073.参数的传递_传递可变对象_内存分析

本文探讨了Python中参数传递的本质,指出其通过引用地址实现。对于可变对象(如列表、字典)的写操作会直接影响原对象,而不可变对象(如数字、字符串)的写操作则会产生新对象。文中通过案例分析了函数中对可变对象的修改,并解释了为何未使用`global`关键字也能修改全局变量的原因。

参数的传递

函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”,所有的赋值操作都是用引用地址来赋值。所以,Python 中参数的传递也是通过引用地址来实现的。
具体操作时分为两类:

  1. 对“可变对象”进行“写操作”,会直接作用于原对象本身;(原对象变化)
  2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”,即用的时候是用的原对象,操作结果放到新空间,原对象不变。)

可变对象有:
字典、列表、集合、自定义的对象等
不可变对象有:
数字、字符串、元组、function 等

传递可变对象时的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等)时,实际还是对对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
【案例】

b = [10, 20]


def f2(m):
    print('m:', id(m))
    m.append(30)
    print('m:', id(m))
    

print('b:', id(b))
f2(b)
print('b:', id(b))
print(b)

运行结果:
在这里插入图片描述
分析:
结果符合前面所阐述的特性。

但是这里要注意一个小问题:071.变量的作用域_全局变量_局部变量_栈帧内存分析讲解 中讲过如果要修改全局变量,需要用global声明,但这里没声名也修改了b,是因为通过将b赋值到函数的形参,使函数获得了使用和修改b所指向的对象的能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值