深、浅拷贝

知识点

概念

  • 引用

    在复制一个变量时,只复制它的引用方式,而没有重新开辟空间来存放它引用的数据,当被复制变量发生变化时,新的变量数据也会同时发生变化。

    1
    2
    3
    a = [1,2]
    b = a
    a.append(3) # a变则b变
  • 浅拷贝:

    在拷贝一个变量时,重新开辟空间来存放它内部数据的引用方式,当内部引用的数据发生变化时,拷贝后的对象同时发生变化。通过copy中的copy方式复制变量:a=copy.copy(b)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a = [1,2]
    b = [3,4]
    c = [a,b]
    d = copy.copy(c)
    a.append(3) # 拷贝地址的内容发生变化,则d发生变化
    c.append((1,2)) # 拷贝的对象发生变化,d不变
    e = c[:] # 利用切片达到的结果等同于e = copy.copy(c)

    # 字典中也有个方法copy
    personal = dict(name = "wuxiang", age=27)
    copy_data = personal.copy() # 此处的copy也是浅拷贝
  • 深拷贝:

    在拷贝一个变量时,重新开辟空间存放它所有最底层引用的数据,新变量和被复制的变量的数据之间都是独立的,彼此之间互不影响。通过copy中的deepcopy方式复制变量,a = copy.deepcopy(b)

  • 注意:

    • 如果拷贝元组的内容是不可变类型数据,则copy.copy和copy.deepcopy拷贝的结果都是原元组的引用指向

    • 如果拷贝元组的内容是可变类型数据,则copy.copy拷贝的是原元组的引用指向,而copy.deepcopy开辟空间存放元组最底层的所有数据

作业

  1. (问答)论述到深、浅拷贝时,说到【引用拷贝】,请简述【引用拷贝】的概念
  2. (问答)论述到深、浅拷贝时,说到【浅拷贝】,请简述【浅拷贝】的概念
  3. (问答)论述到深、浅拷贝时,说到【深拷贝】,请简述【深拷贝】的概念
  4. 现有变量c,对其进行浅拷贝为a
  5. 现有变量c,对其进行深拷贝为a
  6. (问答)字典对象有方法copy(),用于拷贝该字典对象,请问此方法拷贝的结果是哪种拷贝方式
  7. (问答)针对元组的深、浅拷贝有什么异同点