遇到一个问题
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也被修改了。
- 由于 Python 内部引用计数的特性,对于不可变对象,浅拷贝和深拷贝的作用是一致的,就相当于复制了一份副本,原对象内部的不可变对象的改变,不会影响到复制对象
- 浅拷贝的拷贝。其实是拷贝了原始元素的引用(内存地址),所以当拷贝可变对象时,原对象内可变对象的对应元素的改变,会在复制对象的对应元素上,有所体现
- 深拷贝在遇到可变对象时,又在内部做了新建了一个副本。所以,不管它内部的元素如何变化,都不会影响到原来副本的可变对象