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

    赋值
    # 赋值运算, 相当于别名,贴标签,内存是一样的,你变我也变化
    l = ['hi', 1, 2, 3, [4, 5, 6]]
    l2 = l
    print([id(x) for x in l])  # [4421400032, 4417718208, 4417718240, 4417718272, 4421841736]
    print([id(x) for x in l2])  # [4421400032, 4417718208, 4417718240, 4417718272, 4421841736]
    l.append('hello')
    l[0] = 'nice'
    print([id(x) for x in l])  # [4419514296, 4417718208, 4417718240, 4417718272, 4421841736, 4420202712]
    print([id(x) for x in l2])  # [4419514296, 4417718208, 4417718240, 4417718272, 4421841736, 4420202712]
    print(l)  # ['nice', 1, 2, 3, [4, 5, 6], 'hello']
    print(l2)  # ['nice', 1, 2, 3, [4, 5, 6], 'hello']
    
    浅拷贝, 更改的是不可变类型(int, str ),则拷贝的内容不跟着改变
    # 浅拷贝,list1和list2的id 是不同的,但是列表中的每个元素的id是相同的
    # 更改列表中的不可变类型(int, str), 实际上是改变了ID指向,test[0]的id 由4524845296变为了4523498112
    # test1[0]的id没有改变,所以值也不会改变
    # 更改完test[0]的id ,test的id也没有变化, 还是4525168904
    test = ['hi', 4, 5, 6, [7, 8, 9]]
    test1 = test.copy()
    print(id(test))  # 4525168904
    print(id(test1))  # 4525266568
    print([id(x) for x in test])  # [4524845296, 4522334240, 4522334272, 4522334304, 4525265736]
    print([id(x) for x in test1])  # [4524845296, 4522334240, 4522334272, 4522334304, 4525265736]
    test[0] = '呵'
    print(id(test))   # 4525168904
    print(id(test1))  # 4525266568
    print([id(x) for x in test])  # [4523498112, 4522334240, 4522334272, 4522334304, 4525265736]
    print([id(x) for x in test1])  # [4524845296, 4522334240, 4522334272, 4522334304, 4525265736]
    print(test)  # ['呵', 4, 5, 6, [7, 8, 9]]
    print(test1)  # ['hi', 4, 5, 6, [7, 8, 9]]
    
    浅拷贝,更改的是可变的子列表,拷贝的内容则跟着改变
    # 浅拷贝,list1和list2的id 是不同的,但是列表中的每个元素的id是相同的
    # 更改列表只中的子列表(列表是可变的数据类型),拷贝的内容也会变,注意子列表的id其实是没变化的为 4564984648
    # 更改了list1[-1],list1列表的id也没有变化 还是4564887816
    list1 = ['hi', 1, 2, 3, [4, 5, 6]]
    list2 = list1.copy()
    print(id(list1))  # 4564887816
    print(id(list2))  # 4564985480
    print([id(x) for x in list1])  # [4564542944, 4560861120, 4560861152, 4560861184, 4564984648]
    print([id(x) for x in list2])  # [4564542944, 4560861120, 4560861152, 4560861184, 4564984648]
    print(list1)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(list2)  # ['hi', 1, 2, 3, [4, 5, 6]]
    list1[-1].append('4')
    print(list1)  # ['hi', 1, 2, 3, [4, 5, 6, '4']]
    print(list2)  # ['hi', 1, 2, 3, [4, 5, 6, '4']]
    print([id(x) for x in list1])  # [4564542944, 4560861120, 4560861152, 4560861184, 4564984648]
    print([id(x) for x in list2])  # [4564542944, 4560861120, 4560861152, 4560861184, 4564984648]
    print(id(list1))  # 4564887816
    print(id(list2))  # 4564985480
    
    深拷贝:改变的是可变的数据类型,深拷贝是你变我不变, 对于列表中嵌套的列表,拷贝后的嵌套列表id 是不同的
    # 深拷贝:对于不可变的数据类型(int string等), 为节省空间,id 是相同的 4562511328, 4558849984, 4558850016, 4558850048
    # 对于可变的数据类型(如list),拷贝的id是不同的
    # 深拷贝改变可变的数据类型(如嵌套列表l[4]), 则拷贝的内容不会改变
    # 更改了子元素,原始数组l的id 值没有改变,依然为4562953544
    import copy
    # 深浅拷贝
    l = ['hi', 1, 2, 3, [4, 5, 6]]
    l1 = copy.deepcopy(l)
    print(l)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(l1)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(id(l))  # 4562953544
    print(id(l1))  # 4562953288
    print([id(x) for x in l])  # [4562511328, 4558849984, 4558850016, 4558850048, 4562953608]
    print([id(x) for x in l1])  # [4562511328, 4558849984, 4558850016, 4558850048, 4562909128]
    l[4].append('hello')
    print(l)  # ['hi', 1, 2, 3, [4, 5, 6, 'hello']]
    print(l1)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(id(l))  # 4562953544
    print(id(l1))  # 4562953288
    
    
    深拷贝:更改不可变数据类型,实际行是指向变化了,开辟了个新的内存。
    # 
    # 深拷贝:可变的数据类型,拷贝之后id不同
    import copy
    # 深浅拷贝
    l = ['hi', 1, 2, 3, [4, 5, 6]]
    l1 = copy.deepcopy(l)
    print(l)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(l1)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(id(l))  # 4426221128
    print(id(l1))  # 4426221000
    print([id(x) for x in l])  # [4425779440, 4422096832, 4422096864, 4422096896, 4426221192]
    print([id(x) for x in l1])  # [4425779440, 4422096832, 4422096864, 4422096896, 4426220936]
    l[0] = ['hello']
    print(l)  # [['hello'], 1, 2, 3, [4, 5, 6]]
    print(l1)  # ['hi', 1, 2, 3, [4, 5, 6]]
    print(id(l))  # 4426221128
    print(id(l1)) # 4426221000
    print([id(x) for x in l])  # [4426220872, 4422096832, 4422096864, 4422096896, 4426221192]
    print([id(x) for x in l1]) # [4425779440, 4422096832, 4422096864, 4422096896, 4426220936]
    

    浅拷贝:list dic : 嵌套的可变的数据类型id是同一个,你变我也变

    深拷贝:list dic :嵌套的可变的数据类型id不是同一个,你变我不变

    l1 = [1, 2, 3, [22, 33]]
    l2 = l1[:]
    l1[3].append(666)
    print(l1)  # [1, 2, 3, [22, 33, 666]]
    print(l2)  # [1, 2, 3, [22, 33, 666]] 你变我也变,证明切片是浅拷贝
    
    
  • 相关阅读:
    ios开发 <AppName>-Prefix.pch文件的用法详解
    iOS Block全面分析
    _weak typeof(self) weakSelf = self
    判断当前iOS设备的方法
    修改UITextfield的Placeholder字体的颜色
    uibutton实现左文字右图片
    apache Apache winnt_accept: Asynchronous AcceptEx failed 错误的解决
    android4.0 锁屏实现(转)
    android 代码设置、打开wifi热点及热点的连接(转)
    tomcat arp
  • 原文地址:https://www.cnblogs.com/jnsn/p/12713645.html
Copyright © 2011-2022 走看看