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

    深浅拷贝

    • 1. 直接赋值. 两个变量指向同一个对象.
    • 2. 浅拷贝:只拷贝第一层内容. copy()
    • 3. 深度拷贝: 对象中的所有内容都会被拷贝一份

    拷贝比创建对象的过程要快

    赋值

    lst1 = ["金毛狮王", "紫衫龙王", ]
    lst2 = lst1  # 列表,进行赋值操作. 实际上是引用内存地址的赋值. 内存中此时只有一个列表. 两个变量指向一个列表
    lst2.append("白眉鹰王")  # 对其中的一个进行操作. 两个都跟着变
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['金毛狮王', '紫衫龙王', '白眉鹰王'] 55256808
    ['金毛狮王', '紫衫龙王', '白眉鹰王'] 55256808

    对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以.ls2的内存指向和ls是一样的. ls改变了, ls2也发了改变

    浅拷贝

    浅拷贝 copy 创建新对象

    lst1 = ["赵本山", "刘能", "赵四"]
    lst2 = lst1.copy()  # lst2 和lst1 不是一个对象了
    lst1.append("谢大脚")
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['赵本山', '刘能', '赵四', '谢大脚'] 58861288
    ['赵本山', '刘能', '赵四'] 58898872

    拷贝了一个新的对象,内存地址都不一样,lst1.append("谢大脚")只是给lst1添加了

    可以用下图来表示整个过程

     在来一个例子

    lst1 = ["超人", "七龙珠", ["金城武", "渣渣辉"]]
    lst2 = lst1.copy()  # 拷贝. 浅拷贝 拷贝第一层
    lst1[2].append("大哥")
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 53918136
    ['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 53917096

    import copy
    names = ["aa", 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    print(names)
    name3 = copy.copy(names)  # name3=names.copy()
    print(name3)
    names[1] = 'LL'  # 改指定位置的元素
    print(names)
    print(name3)
    names[2][0] = 'ZOU'
    print(names)
    print(name3)

    结果:

    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']

    Copy只copy第一个列表里的。如果列表里还有列表(只拷贝里面的内存地址),则里面的更改时copy的也会变  浅拷贝

    深 copy

    import copy
    
    lst1 = ["超人", "七龙珠", ["金城武", "渣渣辉"]]
    lst2 = copy.deepcopy(lst1)  # 把lst1扔进去进行深度拷贝 , 包括内部的所有内容进行拷贝
    lst1[2].append("大哥")
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 46314920
    ['超人', '七龙珠', ['金城武', '渣渣辉']] 46314240

     引用import copy的deepcopy则复制的不随着更改而改变,因为内存地址也复制了一份,内存地址也改变了

    import copy
    
    names = ["aa", 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    print(names)
    name3 = copy.deepcopy(names)
    print(name3)
    names[1] = 'LL'
    print(names)
    print(name3)
    names[2][0] = 'ZOU'
    print(names)
    print(name3)

    结果:

    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/12994694.html
Copyright © 2011-2022 走看看