Python函数,修改参数的值(浅拷贝,深拷贝)

遇到一个问题

def aa(a):
    a['a'] =34

dict_01 = {'a':2}
print(dict_01)
aa(dict_01)
print(dict_01)

b= 2
def bb(b):
    b+=1
    print(b)
bb(b)
print(b)

在这里插入图片描述

同样是作为参数被传入函数内,在函数内修改参数,整数a的值没有被改变,但是字典的值被改变了。(这是因为前者是不可修改的数据类型,而后者是可以修改的数据类型)
在python里,如果将字符串,元组,int型(不可修改)的数据作为参数传入函数中,在函数中修改其值,不会修改该变量真正的值。如果想要更改,可以用global来申明一下。
但如果将字典,列表(可以修改)作为参数传入函数中,在函数中修改值,会改变原变量的值。

之所以说python里的int型a=5,a的值是不可修改的是因为令a=6,其实并不是修改了a的值,而是将a->5改为了a->6。而字符串类型的不可修改就更简单了,你无法更改str[0],str[1],只能重新定义一个字符串。
而修改列表里的list[0]或者字典里的dict[‘a’],可以直接修改,重新赋值的。

这有点类似与python的浅拷贝与深拷贝的概念。
深拷贝:
a=5,也就是a->5,深拷贝使b->a,重新赋值b=6,实际是令b->6,a的值并未被修改(依旧是a->5),a没有重新指向。
浅拷贝:
a=5,也就是a->5,浅拷贝使a(b)->5,修改b的值则a也被修改了。

  1. 由于 Python 内部引用计数的特性,对于不可变对象,浅拷贝和深拷贝的作用是一致的,就相当于复制了一份副本,原对象内部的不可变对象的改变,不会影响到复制对象
  2. 浅拷贝的拷贝。其实是拷贝了原始元素的引用(内存地址),所以当拷贝可变对象时,原对象内可变对象的对应元素的改变,会在复制对象的对应元素上,有所体现
  3. 深拷贝在遇到可变对象时,又在内部做了新建了一个副本。所以,不管它内部的元素如何变化,都不会影响到原来副本的可变对象
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值