zoukankan      html  css  js  c++  java
  • python中的赋值和深浅拷贝

    1、赋值操作

    python在赋值操作时 如果是可变数据类型修改了其中一个变量,另一个跟着改变。注意对不可变对象,新赋值,就是修改了指向。(int、字符串(string)、float、(数值型number)、元组(tuple))

    s1 = 'ab'
    s2 = s1
    print(s1, s2)  # ab ab
    print(id(s1), id(s2))  # 1888495190848 1888495190848
    s2 = 'cd'
    print(s1, s2)  # ab cd
    print(id(s1), id(s2))  # 1888495190848 1888495191016
    
    l1 = [1, 3, [5, ]]
    l2 = l1
    print(l1, l2)  # [1, 3, [5]] [1, 3, [5]]
    print(id(l1), id(l2))   # 2228045300040 2228045300040
    l2.append(2)
    l1[2].append(6)
    print(id(l1[1]), id(l2[1]))   # 1679715136 1679715136
    print(l1, l2)   # [1, 3, [5, 6], 2] [1, 3, [5, 6], 2]

    2、浅拷贝

    浅拷贝相当于重新开辟了一块对象空间,但是空间中的可变和不可变元素的地址都相同。注意 对于可变类型中的可变类型的修改是会互相影响的。

    l1 = [1, 3, [5, ]]
    l2 = l1.copy()
    print(l1, l2)          # [1, 3, [5]] [1, 3, [5]]
    print(id(l1), id(l2))  # 1786145751368 1786145752008
    l1.append(2)
    l1[2].append(6)
    print(id(l1[1]), id(l2[1]))  # 1679715136 1679715136
    print(l1, l2)          # [1, 3, [5, 6], 2] [1, 3, [5, 6]]

    3、深拷贝 相当于重新开辟了一块对象空间,但是空间中的可变的地址相同(可变元素指向相同),不可变元素的地址不同(不可变元素重新开辟空间)。

    from copy import deepcopy
    l1 = [1, 3, [5, ]]
    l2 = deepcopy(l1)
    
    print(l1, l2)            # [1, 3, [5]] [1, 3, [5]]
    print(id(l1), id(l2))    # 2995101844168 2995101849736
    l1.append(2)
    l1[2].append(6)
    print(id(l1[1]), id(l2[1]))  # 1679715136 1679715136
    print(id(l1[2]), id(l2[2]))  # 2177305756616 2177305760904
    print(l1, l2)            # [1, 3, [5, 6], 2] [1, 3, [5]]

    总结:

    1. 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。

    2. 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。

    3. 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。

    参考 https://www.jianshu.com/p/66e6f3745fc1

  • 相关阅读:
    美国地质调研局USGS
    SAR 图像
    Matlab 之meshgrid, interp, griddata 用法和实例
    ENVISAT卫星及ASAR数据介绍
    ASP.NET Integration with IIS7
    ubuntu下C/C++基本开发环境的配置
    C++ Objects Part 1: Basic Object Memory Layout
    Socket Programming in Windows
    Memory Layout for Multiple and Virtual Inheritance
    Common Type System—Memory Layout at C# Online.NET
  • 原文地址:https://www.cnblogs.com/chen55555/p/11285396.html
Copyright © 2011-2022 走看看