zoukankan      html  css  js  c++  java
  • 深浅拷贝

    深浅拷贝

    赋值:多个变量名指向同一个内存地址一个变量对其进行操作,其他变量查看时都变动

    lst = [1,2,3,[5,6,7]]
    lst1 = lst
    print(lst1)
    print(lst)
    
    lst[-1].append(8)
    print(lst1)
    print(lst)
    

    浅拷贝:lst[1:10] -- 是浅拷贝浅拷贝只拷贝第一层元素修改第一层元素是,新开辟的不进行改变

    lst = [1,2,3,[5,6,7]]
    lst1 = lst.copy()
    lst1[-1].append(8)
    print(lst)
    print(lst1)
    
    lst = [1,2,3,[5,6,7]]
    lst1 = lst.copy()
    lst[3] = 567
    print(lst1)
    print(lst)
    
    lst = [1,2,3,4,[5,6,7,[8,9]]]
    lst1 = lst.copy()  #  [1,2,3,4,[5,6,7,[8,9]],10]
    lst1.append(10)
    print(lst)
    print(lst1)
    
    lst = [1,2,3,4,[5,6,7,[8,9]]]
    lst1 = lst.copy()
    lst1[-1][-1] = "56"
    print(lst) # [1,2,3,4,[5,6,7,[8,9]]]
    print(lst1) # ["56",2,3,4,[5,6,7,[8,9]]]
    
    lst = [[1,2,],90,6,7,[5,6]]
    lst1 = lst.copy()
    lst1[-1] = 8
    print(lst)
    print(lst1)
    
    dic = {"alex":[1,2,3,[5,6]]}
    dic1 = dic.copy()
    dic["alex"][0] = "56"
    print(dic)
    print(dic1)
    

    深拷贝:不可变的数据类型共用,可变的数据类型重新开辟一个空间对源数据进行修改,深拷贝的内容不进行改变

    import copy  #导入
    lst = [1,2,3,[5,6,7]]
    lst1 = copy.deepcopy(lst)  # 深拷贝
    lst[-1].append(8)
    print(lst)
    print(lst1)
    
    lst = [1,2,3,[5,6,7,[8,10,9]]]
    import copy
    lst1 = copy.deepcopy(lst)
    print(id(lst[-1][-1]))
    print(id(lst1[-1][-1]))
    
    
    面试题:
    li = [1,2]
    li[1] = li
    print(li)
    结果:[1, [...]]
    

    总结:

    • 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
    • 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
    • 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。
  • 相关阅读:
    EF中連表查詢的應用方式
    排序刷新及其分頁
    SpringMVC与前台的json数据交互
    最详细的springmvc-mybatis教程
    数据库主从复制
    display:inline、block、inline-block的区别
    Yii框架中有关于layout的说明
    创建yii的第一个应用
    学习bootstrap的总结文章
    数据库事物隔离级别通俗理解
  • 原文地址:https://www.cnblogs.com/fengqiang626/p/11170123.html
Copyright © 2011-2022 走看看