在https://www.toutiao.com/i6755714650077135363/中已经讲述了何为函数的参数传递概念,以及传递可变对象的知识点。
此处要感谢一位条友指出的错误之处:元组是不可变对象!
本文要学习的就两个知识点:
1、函数传递不可变对象的引用;
2、不可变对象中是可以包含可变对象的。
在Python中的不可变对象包含int、Float、字符串、元组、布尔值等,但在函数传递参数时还是传递这些不可变对象的引用。特别之处是由于不可变对象无法修改,所以在进行“赋值操作”时,Python只能再创建一个新的对象。
我们以一个最简单的案例做分析:
看看执行效果:
传递不可变对象引用案例
【结论】
回忆学过的Python序列就知道元组(不可变对象)中是可以用列表(可变对象)作为元素的。这就很容易令我们产生一个问题:假如函数传递的参数不可变对象中包含了可变对象,但对可变对象进行赋值操作会有什么效果呢?
# 不可变对象中的可变对象s = (30,50,100,[40,20]) # 包含列表的元组print('被函数调用前s的ID为:',id(s))print('被函数调用前s的值为:',s)def test01(n): print('赋值前n的ID为:',id(n)) # 赋值前的n n[3][1] = 2019 print('赋值后n的ID为:',id(n)) # 赋值后的n print('赋值后n的值为:',n) # 赋值后的ntest01(s)print('被函数调用后s的ID为:',id(s))print('被函数调用后s的值为:',s)
执行效果:
不可变对象的可变对象
【结论】
初中物理知道“静止与运动是相对的”。在这里我也想用“变与不变都是相对的”来总结可变对象与不可变对象的关系。
在学习Python的过程中要有辩证的思维,在区分清楚不可变与可变的关系后,还要想到两者的关联关系。
联系客服