python 浅拷贝|深拷贝

时间:2021-11-16 22:08:27
  • 数字和字符串

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址

#赋值  n1 = 123 print(id(n1)) n = n1 print(id(n))

输出结果:

  140721961362272
  140721961362272

#浅拷贝 import copy #数字 n1 = 123 print(id(n1)) a = copy.copy(n1) print(id(a)) #字符串 n2 = "you are a pig" b = copy.copy(n2) print(id(n2)) print(id(b))

输出结果:

  #数字

    140721970013024
    140721970013024

  #字符串
    1373912335728
    1373912335728

#深拷贝 import copy #数字 n1 = 123 print(id(n1)) a = copy.deepcopy(n1) print(id(a)) #字符串 n2 = "you are a pig" b = copy.deepcopy(n2) print(id(n2)) print(id(b))

输出结果:

  #数字

    140721970013024
    140721970013024

  #字符串
    1869362529648
    1869362529648

  • 其他基本数据类型

  对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

  • 赋值:

  赋值,只是创建一个变量,该变量指向原来内存地址,如:

'''赋值''' n1 = ["you","are",["a","pig"]] n2 = n1 print(id(n1)) print(id(n2))

输出结果:

  2480562397832
  2480562397832

  • 浅拷贝:

  对于可变对象如:列表、字典,直接赋值时只会将一个对象的引用传递给另一个对象,此时修改其中一个对象就会改变另一个对象;大多数情况下,一个可变对象内还可以嵌套其它可变对象,此时浅拷贝只会拷贝*对象,而对于嵌套的对象,只会复制它的引用,所以修改*对象不会影响另一个对象,但是如果修改嵌套的对象就会影响两个对象。

'''复制(浅拷贝)''' import copy n1 = ["you","are",["a","pig"]] n3 =copy.copy(n1) n1[2][1] = "BIG_PIG" print(n1) print(id(n1)) print(n3) print(id(n3))

输出结果:

  ['you', 'are', ['a', 'BIG_PIG']]
  1614775337864
  ['you', 'are', ['a', 'BIG_PIG']]
  1614775224776

  由结果可知,浅拷贝只拷贝第一层的元素。

python 浅拷贝|深拷贝

  • 深拷贝:

  深拷贝就是将*对象以及子对象的值同时复制给新对象,此时修改任何一个都不会影响另一个。

'''深拷贝''' import copy n1 = ["you","are",["a","pig"]] n3 =copy.deepcopy(n1) n1[2][1] = "BIG_PIG" print(n1) print(id(n1)) print(n3) print(id(n3))

输出结果:

  ['you', 'are', ['a', 'BIG_PIG']]
  2350443541576
  ['you', 'are', ['a', 'pig']]
  2350443432712

  由结果可知,深拷贝是拷贝最深层的元素。

python 浅拷贝|深拷贝