文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python参数的传递

2023-09-10 16:35

关注

函数的参数传递本质上就是:从实参到形参的赋值操作。Python中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python中参数的传递都是“引用传递”,不是“值传递”。

具体操作时分为两类:

  1. 对“可变对象”进行“写操作”,直接作用于原对象本身。
  2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。
  • 可变对象有:

字典、列表、集合、自定义的对象等

  • 不可变对象有:

数字、字符串、元组、function等

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

【操作】参数传递:传递可变对象的引用

b = [10,20]def f2(m):  print("m:",id(m))    #b和m是同一个对象  m.append(30)  #由于m是可变对象,不创建对象拷贝,直接修改这个对象​f2(b)print("b:",id(b))print(b)

执行结果:

m: 45765960

b: 45765960

[10, 20, 30]

传递参数是不可变对象(例如:intfloat、字符串、元组、布尔值),实际传递的还是对象的引用。在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。

【操作】参数传递:传递不可变对象的引用

a = 100def f1(n):  print("n:",id(n))    #传递进来的是a对象的地址  n = n+200      #由于a是不可变对象,因此创建新的对象n  print("n:",id(n))  #n已经变成了新的对象  print(n)f1(a)print("a:",id(a))

执行结果:

n: 1663816464

n: 46608592

300

a: 1663816464

显然,通过id值我们可以看到na一开始是同一个对象。给n赋值后,n是新的对象。

为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。

  1. 浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。
  2. 深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象
#测试浅拷贝和深拷贝import copy​def testCopy():  '''测试浅拷贝'''  a = [10, 20, [5, 6]]  b = copy.copy(a)​  print("a", a)  print("b", b)  b.append(30)  b[2].append(7)  print("浅拷贝......")  print("a", a)  print("b", b)​def testDeepCopy():  '''测试深拷贝'''  a = [10, 20, [5, 6]]  b = copy.deepcopy(a)​  print("a", a)  print("b", b)  b.append(30)  b[2].append(7)  print("深拷贝......")  print("a", a)  print("b", b)​testCopy()print("*************")testDeepCopy()

运行结果:

a [10, 20, [5, 6]]

b [10, 20, [5, 6]]

浅拷贝......

a [10, 20, [5, 6, 7]]

b [10, 20, [5, 6, 7], 30]


a [10, 20, [5, 6]]

b [10, 20, [5, 6]]

深拷贝......

a [10, 20, [5, 6]]

b [10, 20, [5, 6, 7], 30]

#传递不可变对象时。不可变对象里面包含的子对象是可变的。则方法内修改了这个可变对象,源对象也发生了变化。​a = (10,20,[5,6])print("a:",id(a))​def test01(m):  print("m:",id(m))  m[2][0] = 888  print(m)  print("m:",id(m))​test01(a)print(a)

运行结果:

a: 41611632

m: 41611632

(10, 20, [888, 6])

m: 41611632

(10, 20, [888, 6])

来源地址:https://blog.csdn.net/Calor13/article/details/130693052

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯