python中的深浅拷贝
标签搜索
侧边栏壁纸
  • 累计撰写 13 篇文章
  • 累计收到 114 条评论

python中的深浅拷贝

wenshijian
2024-11-21 / 0 评论 / 14 阅读 / 正在检测是否收录...

如题,这里复习一下python的深浅拷贝问题(因为考试的时候有道题做错了:()

首先看定义:

浅拷贝:浅拷贝会创建一个新的对象,但新的对象仅复制原对象的第一层内容,对于嵌套的子对象,仅复制引用,不会递归拷贝内部对象。

  import copy

  original = [1, [2, 3], 4]
  shallow = copy.copy(original)
  
  shallow[0] = 99          # 修改第一层元素
  shallow[1][0] = 88       # 修改嵌套的子对象
  
  print("Original:", original)  # Original: [1, [88, 3], 4]
  print("Shallow:", shallow)    # Shallow: [99, [88, 3], 4]

深拷贝:深拷贝会创建一个新的对象,并递归拷贝所有嵌套的子对象,使新对象完全独立于原对象。

  import copy

  original = [1, [2, 3], 4]
  deep = copy.deepcopy(original)
  
  deep[0] = 99            # 修改第一层元素
  deep[1][0] = 88         # 修改嵌套的子对象
  
  print("Original:", original)  # Original: [1, [2, 3], 4]
  print("Deep:", deep)          # Deep: [99, [88, 3], 4]

但是,我一直有个误区,把"引用传递"机制当成浅拷贝,这是两个不同的概念,python基于值的内存管理造就了引用传递,但是引用传递在对象的可变性不同时又会呈现不同的效果,比如在函数传参时,可变对象(list)和不可变对象(tuple)都是引用传递,但是效果是不一样的:

  def test(lst:list, string:str):
    lst[0] = 10
    string += 'a'
    return string

  lst = [1,2,3]
  string = 'vscode'
  
  string_new = test(lst, string)
  
  print(lst, string, string_new)

  #输出  [10, 2, 3] vscode vscodea

由于传递的是引用,所以对函数内列表形参修改时也会影响外部的原始列表,但是字符串由于是不可变对象,所以当你在函数内对其进行一些合法的操作时,会创建一个新的对象用于操作,而不会修改原始对象.
写下此文,希望下次 不再犯错

2

评论 (0)

取消