注:今天在Leetcode上刷题,用python写递归函数是在是被传值的问题绕晕了,因此决定好好查找资料,进行一番总结~~~
首先,我们需要明白在Python中一切都是以对象的形式存在的,变量只是存储指向对象的地址。关系如下图所示:
赋值“=”是将右侧对象在内存中的存储地址赋值给左侧的变量。
赋值只是指向同一个对象的内存地址。
浅拷贝copy会将对象的第一层拷贝一份到新的内存地址中,而深拷贝deepcopy是完全复制原变量的所有层的的所有数据,在内存中为其生成一套完全相同的内容存储。举例如下:
import copy
dict = {'a':[1,2,3,4],'b':2}
dd = copy.deepcopy(dict)
print(dd)
ee = copy.copy(dict)
print(ee)
dd['a'][0] = 7
print(dd)
print(dict)
ee['a'][0] = 7
print(ee)
print(dict)
print(id(dict))
print(id(dd))
print(id(ee))
print(id(dd['a']))
print(id(ee['a']))
print(id(dict['a']))
{'a':[1,2,3,4],'b':2}
{'a':[1,2,3,4],'b':2}
{'a':[7,2,3,4],'b':2}
{'a':[1,2,3,4],'b':2}
{'a':[7,2,3,4],'b':2}
{'a':[7,2,3,4],'b':2}
20109472
20244496
20495072
20272112
20221511
20221511
Python参数传递统一使用的都是引用传递,只是由于变量类型中有可变对象和不可变对象产生了差异。其中List,Dict,Set是可变对象,传递后可以被修改;而number,string,tuple是不可变对象,传递之后不能被修改,一旦被修改就会给变量赋值一个新的存储地址。