python中列表和字典的深拷贝的问题

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并没有发生改变,
# 这里不涉及深拷贝的知识点,形参变量则是将实参变量复制了一份。

深拷贝为什么存在?
个人猜测是普通变量的内存很小,在执行时对其复制一份,不会占用很多内存。但是列表和字典等,其数据量很大,作为形参时复制一份,则会非常耗费内存,这里只有在必要的时候才会要求手动复制一份,节省内存消耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值