• Python中的拷贝与深浅拷贝


    赋值

    即为赋值.举个例子

    a = 147147
    b = a # 赋值
    print(a is b) # True
    

    结论:对于通过用 = 号赋值,数字和字符串在内存当中用的都是同一块地址。

    浅拷贝

    对于浅拷贝,字典、列表、元组等类型,它们只拷贝第一层地址

    import copy
    
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 678]}
    n3 = copy.copy(n1)  # 浅拷贝
    print("第一层字典的内存地址:")
    print(id(n1))
    print(id(n3))
    print("第二层嵌套的列表的内存地址:")
    print(id(n1["k3"]))
    print(id(n3["k3"]))
    

    结果

    第一层字典的内存地址:
    6516024
    6516096
    第二层嵌套的列表的内存地址:
    36995720
    36995720
    

    第一层的n1和n3指向的内存地址已经改变了,但是第二层的列表并没有拷贝成功,它的内存地址还是一样的,所以当n3第二层的列表进行修改的时候,n1里的列表也会被修改.

    原理如下

    深拷贝

    deepcopy

    import copy
    
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 678]}
    n4 = copy.deepcopy(n1)  # 深拷贝
    print("第一层字典的内存地址:")
    print(id(n1))
    print(id(n4))
    print("第二层嵌套的列表的内存地址:")
    print(id(n1["k3"]))
    print(id(n4["k3"]))
    

    结果:

    第一层字典的内存地址:
    31157560
    35463600
    第二层嵌套的列表的内存地址:
    35947144
    35947336
    

    结论:内存地址都改变了,有几层嵌套就改变几层嵌套,很牛逼的一个拷贝,都是引用的n1的里面的值
    原理如下:

  • 相关阅读:
    asp.net 内部重定向
    配置元素customErrors
    路由配置4-伪静态
    路由配置3
    路由配置2(转)
    ASP.NET实现图片防盗链(转)
    global中拦截404错误的实现方法
    使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)
    HttpApplication事件执行顺序(转)
    Android Studio NDK 新手教程(5)--Java对象的传递与改动
  • 原文地址:https://www.cnblogs.com/jhpy/p/12045253.html
Copyright © 2020-2023  润新知