传递规则
- Python赋值过程中不明确区分拷贝和引用;
- 一般对静态变量的传递为拷贝,对动态变量的传递为引用;
- 字符串,数值,元组均为静态变量;
- 列表,字典为动态变量;
- 注意:对静态变量首次传递时也是引用,当需要修改静态变量时,因为静态变量不能改变,所以需要生成一个新的空间存储数据;
浅拷贝
- Python中一般都是浅拷贝,拷贝时对象包含的子对象内容不拷贝;
- 源对象和拷贝对象会引用同一个子对象;
- 浅拷贝的方式:
- 引入copy模块,使用其中的copy方法;
- 举例:
import copy dd=copy.copy(dict)
- 举例:
- 直接使用该数据类型自带的copy方法;
- 举例:
dd=dict.copy()
- 举例:
- 引入copy模块,使用其中的copy方法;
- 举例:
输出结果为:dict = {'a':[1,2,3,4,5],'b':2} dd= dict.copy()//为浅拷贝 print(dd) dd["a"][0]=9 print(dd) print(dict) dd["b"]=10 print(dd) print(dict)
{'a': [1, 2, 3, 4, 5], 'b': 2} //dd为对dict的浅拷贝 {'a': [9, 2, 3, 4, 5], 'b': 2} //改变dd中列表元素a的值(列表为动态变量,浅拷贝时传递的是地址) {'a': [9, 2, 3, 4, 5], 'b': 2} //改变dd中动态变量的值会影响到dict中动态变量的值 {'a': [9, 2, 3, 4, 5], 'b': 10} //改变dd中静态变量的值(数字为静态变量,浅拷贝时传递的是值) {'a': [9, 2, 3, 4, 5], 'b': 2} //改变dd中静态变量的值不影响dict中静态变量的值
深拷贝
- 需要引入copy模块;
- 使用从copy模块中的deepcopy函数,递归拷贝对象中包含的子对象;
- 源对象和拷贝对象的所有子对象也不相同;
- 举例:
此时我们对其中任何一个对象进行修改时都不会影响其他对象中变量的值;输出结果为:import copy dict = {'a':[1,2,3,4,5],'b':2} dd = copy.deepcopy(dict) //深拷贝 print(dd) dd["a"][0]=9 print(dd) print(dict) dd["b"]=10 print(dd) print(dict)
{'a': [1, 2, 3, 4, 5], 'b': 2} {'a': [9, 2, 3, 4, 5], 'b': 2} {'a': [1, 2, 3, 4, 5], 'b': 2} {'a': [9, 2, 3, 4, 5], 'b': 10} {'a': [1, 2, 3, 4, 5], 'b': 2} //此时对dd进行任何修改都不会影响dict中的数据