传值?传引用
Python不允许程序员选择采用传值还是传引用。
Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象。
如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值'来传递对象。
这和深拷贝浅拷贝关系很类似。
注意:数字和字符串中的内存都指向同一个地址,所以深拷贝和浅拷贝对于他们而言都是无意义的
浅拷贝
浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。
使用浅拷贝的时候,分为两种情况:
第一种,如果最外层的数据类型是可变的,比如说列表,字典等,浅拷贝会开启新的地址空间去存放。
第二种,如果最外层的数据类型是不可变的,比如元组,字符串等,浅拷贝对象的时候,还是引用对象的地址空间。
深拷贝
深拷贝就是包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
深拷贝对一个对象是所有层次的拷贝(递归),内部和外部都会被拷贝过来。
深拷贝也分两种情况:
第一种,最外层数据类型可变。这个时候,内部和外部的都会拷贝过来。
第二种,外层数据类型不可变,如果里面是可变数据类型,会新开辟地址空间存放。如果内部数据类型不可变,才会如同浅拷贝一样,是对地址的引用。