• 【拷贝问题】


    练习1
    下面代码运行后,a、b、c、d四个变量的值,描述错误的是?

    import copy
    a=[1,2,3,4['a','b','c','d']]
    b=a
    c=copy.copy(a)
    d=copy.deepcopy(a)
    a.append(5)
    a[4].append('c')
    

    正确结果为:

    a==[1,2,3,4,['a','b','c'],5]
    b==[1,2,3,4,['a','b','c'],5]
    c==[1,2,3,4,['a','b','c']]
    d==[1,2,3,4,['a','b']]
    

    解析:

    b=a 为引用,除非直接给a重新赋值,否则a变则b变
    c=copy.copy(a) 浅拷贝,只会复制父对象,不会拷贝子对象;所以子对象变则c变,父对象变c不变
    d=copy.deepcopy(a) 深拷贝,d与a不相关,a不论怎么变不影响d
    

    !!!字典拷贝实例讲解

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    dict1 =  {'user':'runoob','num':[1,2,3]}
    dict2 = dict1          # 浅拷贝: 引用对象
    dict3 = dict1.copy()   # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用 
    # 修改 data 数据
    dict1['user']='root'
    dict1['num'].remove(1) 
    # 输出结果
    print(dict1)
    print(dict2)
    print(dict3)
    

    结果为:

    {'num': [2, 3], 'user': 'root'}
    {'num': [2, 3], 'user': 'root'}
    {'num': [2, 3], 'user': 'runoob'}
    

    练习2
    字典值为整型数字,变更为另一整型数字

    print('
    字典值为整型数字,变更为另一整型数字
    ')
    import copy
    a={'1':1,'2':2}
    b=copy.copy(a)
    print("最开始,a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
    a['1']=5
    a['2']=6
    print("字典a的值变为5和6后, a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
    print('a,b两个字典第一个元素各为:',a['1'],b['1'])
    print('a,b两个字典第一个元素和为:',a['1']+b['1'])
    a['1']=1
    a['2']=2
    print("字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
    print('a,b两个字典第一个元素各为:',a['1'],b['1'])
    print('a,b两个字典第一个元素和为:',a['1']+b['1'])
    

    结果分别为:

    字典值为整型数字,变更为另一整型数字
    
    最开始,a,a['1'],a['2'],b的内存地址为: 2434050752664 140711531151632 140711531151664 2434051261528
    字典a的值变为5和6后, a,a['1'],a['2'],b的内存地址为: 2434050752664 140711531151760 140711531151792 2434051261528
    a,b两个字典第一个元素各为: 5 1
    a,b两个字典第一个元素和为: 6
    字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为: 2434050752664 140711531151632 140711531151664 2434051261528
    a,b两个字典第一个元素各为: 1 1
    a,b两个字典第一个元素和为: 2
    

    字典值为字符型,变更为另一整型数字

    print('
    字典值为字符型,变更为另一整型数字
    ')
    import copy
    a={'1':'a','2':'b'}
    b=copy.copy(a)
    print("最开始,a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
    a['1']='c'
    a['2']='d'
    print("字典a的值变为'c'和'd'后,a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
    print('a,b两个字典第一个元素各为:',a['1'],b['1'])
    print('a,b两个字典第一个元素和为:',a['1']+b['1'])
    a['1']=1
    a['2']=2
    print("字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
    print('a,b两个字典第一个元素各为:',a['1'],b['1'])
    

    结果分别为:

    字典值为字符型,变更为另一整型数字
    
    最开始,a,a['1'],a['2'],b的内存地址为: 2434051314136 2434041375408 2434041359728 2434050752664
    字典a的值变为'c'和'd'后, a,a['1'],a['2'],b的内存地址为: 2434051314136 2434012296112 2434012299760 2434050752664
    a,b两个字典第一个元素各为: c a
    a,b两个字典第一个元素和为: ca
    字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为: 2434051314136 140711531151632 140711531151664 2434050752664
    a,b两个字典第一个元素各为: 1 a
    小小测试一枚
  • 相关阅读:
    Linux shell 常用命令记录
    [Bat]批量重命名文件
    【转】java术语(PO/POJO/VO/BO/DAO/DTO)
    TesseractOCR3.0语言库训练步骤
    关于Delphi Rtti对应TDatetime的一些启示
    Ubuntu Server 12.04 安装mysql 5.6.10
    Delphi透明 圆角 窗体 【转】
    奇怪的~用法
    很有用的VS2005插件——SlickEdit
    还不习惯Office 2007
  • 原文地址:https://www.cnblogs.com/txdblog/p/15241601.html
Copyright © 2020-2023  润新知