zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    转:全面理解Javascript闭包和闭包的几种写法及用途
    VS2010 AnkhSvn
    silverlight 子UserControl获取父UserControl
    IIS相关
    (转)Javascript中console.log()用法
    (转)Sql Server 保留几位小数的两种做法
    asp.net Web API
    (转)C#中数组、ArrayList和List三者的区别
    PowerDesigner
    (转)jQuery.fn.extend与jQuery.extend到底区别在哪?
  • 原文地址:https://www.cnblogs.com/wspcoding/p/5557691.html
Copyright © 2011-2022 走看看