• python当中的深浅拷贝


    >>>import copy
    
    >>> x={'one':1,'two':['second','third']}
    >>> y=x.copy()  #y是x的浅拷贝
    >>> x                #输出x
    {'two': ['second', 'third'], 'one': 1}
    >>> y                #输出y
    {'two': ['second', 'third'], 'one': 1}
    >>> y['one']=0  #对y的键'one'的值重新赋值
    >>> x
    {'two': ['second', 'third'], 'one': 1}  #可以看到x的键‘one'的值没有变
    >>> y
    {'two': ['second', 'third'], 'one': 0}   #y的键'one'的值重新赋值后为0
    >>> y['two'].remove('third')           
    #上面是删除y的键'two'的值列表里的第二个元素'third'
    >>> x
    {'two': ['second'], 'one': 1}  
    #可以看到x的键'two'的值列表里的第二个元素'third'也被删除了
    >>> y
    {'two': ['second'], 'one': 0}
    >>> x['two'].remove('second')  
    >>> x
    {'two': [], 'one': 1}                        
    #x的键'two'的值列表里的第1个元素'two'被删除了
    >>> y
    {'two': [], 'one': 0}
    #y的键'two'的值列表里的第1个元素'two'被删除了
    >>> x['two']='second'
    >>> x
    {'two': 'second', 'one': 1}
    >>> y
    {'two': [], 'one': 0}

    从上面一段代码可以看到只有删除元素时x才跟着改变,其它不改变,要解决删除时不跟着改变的问题,只有使用深拷贝

     1 >>> from copy import deepcopy          #导入深拷贝模块
     2 >>> x={'one':1,'two':['2','second']}
     3 >>> y=x.copy()                                  #y为x的浅拷贝
     4 >>> y2=x.deepcopy()                         #y2位x的深拷贝
     5 Traceback (most recent call last):         #错误示范
     6   File "<stdin>", line 1, in ?
     7 AttributeError: 'dict' object has no attribute 'deepcopy'
     8 >>> y2=deepcopy(x)                         
     9 #当采用深拷贝时,要把被深拷贝的对象当参数传入
    10 >>> x                                               #输出x
    11 {'two': ['2', 'second'], 'one': 1}
    12 >>> y                                               #输出y
    13 {'two': ['2', 'second'], 'one': 1}
    14 >>> y2                                             #输出y2
    15 {'two': ['2', 'second'], 'one': 1}
    16 >>> y['one']='first'                            #对y的键'one'重新赋值为first
    17 >>> x                                               #可以看到x没有变化
    18 {'two': ['2', 'second'], 'one': 1}
    19 >>> y                                               #重新输出y
    20 {'two': ['2', 'second'], 'one': 'first'}
    21 >>> y2                                             #y2没有变化
    22 {'two': ['2', 'second'], 'one': 1}
    23 >>> y2['one']='1first'                        
    24 #对y2的键'one'重新赋值为1first      
    25 >>> x                                                #x没有变化
    26 {'two': ['2', 'second'], 'one': 1}
    27 >>> y
    28 {'two': ['2', 'second'], 'one': 'first'}       #y没有变化
    29 >>> y2                                               #y2为重新赋值后的字典
    30 {'two': ['2', 'second'], 'one': '1first'}
    31 >>> x
    32 {'two': ['2', 'second'], 'one': 1}
    33 >>> y['two'].remove('2')
    34 >>> x
    35 {'two': ['second'], 'one': 1}
    36 >>> y
    37 {'two': ['second'], 'one': 'first'}
    38 >>> y2
    39 {'two': ['2', 'second'], 'one': '1first'}
    40 >>> y2['two'].remove('second')         
    41 #删除y2键'two'的值列表里的'second'
    42 >>> x
    43 {'two': ['second'], 'one': 1}
    44 >>> y
    45 {'two': ['second'], 'one': 'first'}            #x,y都没有变化
    46 >>> y2
    47 {'two': ['2'], 'one': '1first'}                   #重新输出y2



  • 相关阅读:
    firefox 网页编辑器不能访问剪贴板图片的问题解决
    ubuntu 安装rails 遇到的问题及解决办法
    Mysql索引建立、查询、删除
    UIImage 各种处理(分类)
    iOS加载Gif图片
    json plist 互转
    克隆网站 mac
    UIlabel
    pod 更新 升级
    2016审核标准
  • 原文地址:https://www.cnblogs.com/wspcoding/p/5557691.html
Copyright © 2020-2023  润新知