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

    1.概述

    python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间。

    (1)不可变对象

    a = 1
    b = a
    print(id(a), id(b))
    a = 2  #不可变对象被重新赋值,重新分配了一块内存,ID就变了
    print(a, b)
    print(id(a), id(b))
    

      运行结果:

    (2) 列表直接赋值给列表不属于拷贝, 只是内存地址的引用

    list1 = ["a", "b", "c"]
    list2 = list1
    list1.append("d")
    print(list1, list2)
    print(id(list1), id(list2))
    

      运行结果:

    2.赋值(=)、深拷贝、浅拷贝

    • =: 跟原对象完全相同,原对象改了啥,新对象也改了啥;
    • deepcopy: 原对象改了啥,新对象都不变
    • copy: 列表的列表会被修改

     

    copy浅拷贝:拷贝一个对象,但是对象的属性还是引用原来的,对于可变类型,比如列表和字典,只是复制其引用。基于引用所作的改变会影响到被引用对象。只要原来的对象改变,被浅拷贝的就会改变。

    deepcopy深拷贝:创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用。外围和内部元素都是拷贝对象本身,而不是引用。原来的对象改变了,不会影响到新的深拷贝的。

     注意:对于数字,字符串和其他原子类型等,没有被拷贝的说法。如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。使用copy和deepcopy时,需要了解其使用场景,避免错误。

     运行结果:

    # 浅拷贝
    list1 = ["a", "b", "c"]
    list2 = list1.copy()
    list3=list(list1)  #转换也是浅copy
    list1.append("d")
    print(list1, list2,list3)
    print(id(list1), id(list2),id(list3))
    

      运行结果:

     浅拷贝, 只会拷贝第一层, 第二层的内容不会拷贝

    运行结果:

    # 浅拷贝, 只会拷贝第一层, 第二层的内容不会拷贝
    list1 = ["a", "b", "c", [1, 2, 3]]
    list2 = list1.copy()
    list1[3].append(4)
    print(list1, list2)
    print(id(list1), id(list2))
    

     

      

  • 相关阅读:
    前后台$.post交互并返回JSON对象
    Hello World
    Jquery表单插件使用
    MyBatis插入语句返回主键值
    $ is not defined与SpringMVC访问静态资源
    MySql查询数据令某字段显示固定值
    更改我的网页默认的暴风影音播放器
    adodb.stream对象的方法/属性
    【顶】Asp无组件生成缩略图 (3)
    关于MD5的加解密
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14173096.html
Copyright © 2011-2022 走看看