python中列表和字典的深拷贝的问题
以字典为例
class A:
def __init__(self):
self._data = {}
def set_x(self, x_name, x_data):
self._data[x_name] = x_data
def get_data(self):
return self._data
import numpy as np
def change_a(a):
for i in range(5):
a.set_x(str(i), i)
a = A()
print ("initial a:", a.get_data())
change_a(a)
print ("changed a:", a.get_data())
# 上述代码的输出
initial a: {}
changed a: {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
# change_a函数调用change_a(a),传入实参a,在函数中对形参进行操作,并无返回值,
# 但是实参中的数据却发生了改变。这是因为这里没有对实参进行拷贝一份,
# 而是简单地将形参变量指向存储实参的内存地址。
# 深拷贝:deepcopy则是将变量完整地复制一份,新的变量名会指向新复制的内存地址。
# import copy
# b = copy.deepcopy(a)
def change_b(b):
b = 4
b = 1
change_b(b)
print("changed b:", b)
# 上述代码输出
changed b: 1
# 在执行了change_b(b)函数后, b并没有发生改变,
# 这里不涉及深拷贝的知识点,形参变量则是将实参变量复制了一份。
深拷贝为什么存在?
个人猜测是普通变量的内存很小,在执行时对其复制一份,不会占用很多内存。但是列表和字典等,其数据量很大,作为形参时复制一份,则会非常耗费内存,这里只有在必要的时候才会要求手动复制一份,节省内存消耗。