• 深浅copy


    id(object) 获取对象的内存地址

    is 判断是否是同一个内存空间  == 判断值是否相同

    a = [1,2,3,]
    b = a[:]         # 相当于是浅copy,b指向了一个新的内存空间,但新内存空间中保存的内存地址还是指向了数组[1,2,3,]
    c = a            # c和a指向了同一块内存空间
    print(a is b)    # False
    print(a is c)    # True
    print(a==b)      # True

    同一代码块下的缓存机制、不同代码块下的小数据池(字符串、bool、数值)

    1.赋值,指向同一块内存空间

    a={'n':1}
    b=a                  # a和b不是独立的对象
    print(id(a), id(b))  # 2470858078792 2470858078792
    a={'n':2}
    print(id(a), id(b))  # 2470858079672 2470858078792

    2.浅copy(当里面有可变数据类型时会导致混乱,对不可变数据类型没影响)

    会开辟一个新的内存空间,但是存储的都是数据的内存地址,这些内存地址都指向同一块内存空间。(当有可变数据类型时,也就是会指向可变数据类型的内存地址)

    a = [1, 2, 3, 4, [1, 2, 3]]
    b = a.copy()  # a[:]   
    a.append(5)
    print(a)  # [1, 2, 3, 4, [1, 2, 3], 5]
    print(b)  # [1, 2, 3, 4, [1, 2, 3]]
    a[4].append(4)
    print(a)  # [1, 2, 3, 4, [1, 2, 3, 4], 5]
    print(b)  # [1, 2, 3, 4, [1, 2, 3, 4]]
    print(id(a[0]),id(a[4]))  # 140728064385424 3202058800968   和下面的深copy进行对比
    print(id(b[0]),id(b[4]))  # 140728064385424 3202058800968

    3.深copy(互相不影响)

    可变的数据类型重新创建一份;不可变的数据类型公用,与之前内存地址指向的内存空间相同

    from copy import deepcopy
    
    a = [1, 2, 3, 4, [1, 2, 3]]
    b = deepcopy(a)
    a.append(5)
    print(a)  # [1, 2, 3, 4, [1, 2, 3], 5]
    print(b)  # [1, 2, 3, 4, [1, 2, 3]]
    a[4].append(4)
    print(a)  # [1, 2, 3, 4, [1, 2, 3, 4], 5]
    print(b)  # [1, 2, 3, 4, [1, 2, 3]]
    print(id(a[0]),id(a[4]))  # 140728064385424 3202056259720
    print(id(b[0]),id(b[4]))  # 140728064385424 3202058801096
  • 相关阅读:
    CSS面试题总结
    HTML面试题总结
    JS中如何删除某个元素下的所有子元素(节点)?
    JS apply() call() bind()方法的使用
    JS小游戏--贪吃蛇
    Tensorflow——tf.train.exponential_decay函数(指数衰减法)
    自定义属性
    JS中兼容代码总结---更新中
    测试flex的各种属性
    添加网络打印机_批处理文件
  • 原文地址:https://www.cnblogs.com/pineapple-chicken/p/13235015.html
Copyright © 2020-2023  润新知