Python中的传递规则、浅拷贝与深拷贝

本文介绍了Python中赋值传递规则,区分静态变量和动态变量,详细讲解了浅拷贝(如copy.copy和dict.copy)与深拷贝(copy.deepcopy)的概念、实现方式和影响。通过实例演示了两者在修改操作中的区别。
摘要由CSDN通过智能技术生成

传递规则

  • Python赋值过程中不明确区分拷贝和引用;
  • 一般对静态变量的传递为拷贝,对动态变量的传递为引用;
    • 字符串,数值,元组均为静态变量;
    • 列表,字典为动态变量;
  • 注意:对静态变量首次传递时也是引用,当需要修改静态变量时,因为静态变量不能改变,所以需要生成一个新的空间存储数据;

浅拷贝

  • Python中一般都是浅拷贝,拷贝时对象包含的子对象内容不拷贝;
  • 源对象和拷贝对象会引用同一个子对象;
  • 浅拷贝的方式:
    • 引入copy模块,使用其中的copy方法;
      • 举例:
        import copy
        dd=copy.copy(dict)
        
    • 直接使用该数据类型自带的copy方法;
      • 举例:
        dd=dict.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中的数据
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世澈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值