zoukankan      html  css  js  c++  java
  • python赋值,深拷贝和浅拷贝的区别

    1.赋值

    list1=[[1,2],'fei',66]
    list2=list1
    list1
    [[1, 2], 'fei', 66]
    list2
    [[1, 2], 'fei', 66]
    list2.append(77)
    list2
    [[1, 2], 'fei', 66, 77]
    list1
    [[1, 2], 'fei', 66, 77]
    id(list1),id(list2)
    (72624608, 72624608)

    总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加

    2.浅拷贝

    使用的方法:copy.copy()

    代码示例:

    >>> import copy
    >>> list1=[[1,2],'fei',66]
    >>> list2=copy.copy(list1)
    >>> print(id(list1))
    55713024
    >>> print(id(list2))
    55712864
    >>> print(id(list1[0]),'
    ',id(list2[0]))
    55712184 
     55712184
    >>> print(id(list1[1]),'
    ',id(list2[1]))
    61987040 
     61987040
    >>> print(id(list1[2]),'
    ',id(list2[2]))
    2057136240 
     2057136240
    
    #总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的
    
    >>>list1=[[1,2],'fei',66]
    >>> list2=copy.copy(list1)
    >>> list1
    [[1, 2], 'fei', 66]
    >>> list2
    [[1, 2], 'fei', 66]
    >>> list1[0][0]=11
    >>> list1
    [[11, 2], 'fei', 66]
    >>> list2
    [[11, 2], 'fei', 66]
    >>> list1[1]='change'
    >>> list1
    [[11, 2], 'change', 66]
    >>> list2
    [[11, 2], 'fei', 66]
    
    #总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)

    最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝

    3.深拷贝

    使用的方法:copy.deepcopy()

    代码示例:

    >>> list1=[[1,2],'fei',66]
    >>> list3=copy.deepcopy(list1)
    >>> print(id(list1),'
    ',id(list2))
    62055888 
     55713624
    >>> print(id(list1[0]),'
    ',id(list2[0]))
    55726368 
     55713704
    >>> print(id(list1[1]),'
    ',id(list2[1]))
    61987040 
     61987040
    >>> print(id(list1[2]),'
    ',id(list2[2]))
    2057136240 
     2057136240
    
    #总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样
    
    >>> list1[0][0]=11
    >>> list1
    [[11, 2], 'fei', 66]
    >>> list3
    [[1, 2], 'fei', 66]
    >>> list1[1]='change'
    >>> list1
    [[11, 2], 'change', 66]
    >>> list3
    [[1, 2], 'fei', 66]
    >>> id(list1[1])
    62058944
    >>> id(list3[1])
    61987040
    
    #总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化

    最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)

  • 相关阅读:
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    查看windows和linux下端口是否被占用
    linux系统的默认用户
    修改mysql、oracle、sqlserver默认端口
    linux(centos)下密码有效期和密码复杂度设置
    linux下设置账户锁定阈值:登录失败n次,多长时间后解锁重新登录
    linux账户的锁定和解锁、禁用账号
    执行./install.sh时报错-bash: ./install.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
    突然虚拟机无法联网解决办法,且报错Failed to start LSB: Bring up/down
    kubernetes集群环境搭建(7)
  • 原文地址:https://www.cnblogs.com/pipile/p/12837261.html
Copyright © 2011-2022 走看看