当前位置:   article > 正文

Python基础——赋值、浅拷贝、深拷贝的区别_python 等号赋值引用 浅拷贝和深拷贝的区别

python 等号赋值引用 浅拷贝和深拷贝的区别

        在我们默认意识中,一说到拷贝,大家理所应当地会认为:“拷贝后的数据和源数据只是值相同罢了,而一方的改变不会对另外一方造成影响”。对,这种公认的概念就是Python深拷贝(copy.deepcopy())的直观解释。

        但是,计算机在处理Python程序的时候,有的时候并不是按照我们人类思维如此的直观了当,所以就存在了浅拷贝(copy.copy())和赋值(=)。这三者之间的概念容易搞混,下面通过代码展示。

        Python中id()函数返回对象的唯一标识符,在解释这三者之间的概念的时候,可以通过id()函数更直观的展现。


目录

一、赋值(=)

二、浅拷贝(copy.copy())

三、深拷贝(copy.deepcopy())


一、赋值(=)

        直观理解:赋值的是地址,因此不管源数据和赋值后的数据怎么变,因为指向元素的地址是一样的,所以,a与b的值一直相等。

  1. """赋值"""
  2. a = [1,2,3,[4,5],6]
  3. b = a
  4. print("a的地址:",id(a))
  5. print("b的地址:",id(b))
  6. print("a中各个元素的地址:",list(id(i) for i in a))
  7. print("b中各个元素的地址:",list(id(i) for i in b))
  8. print("#################################")
  9. a[0]=9
  10. print("改变后的值,a:",a)
  11. print("改变后的值,b:",b)

运行结果:

  1. a的地址: 1624960881672
  2. b的地址: 1624960881672
  3. a中各个元素的地址: [140728839074064, 140728839074096, 140728839074128, 1624960881160, 140728839074224]
  4. b中各个元素的地址: [140728839074064, 140728839074096, 140728839074128, 1624960881160, 140728839074224]
  5. #################################
  6. 改变后的值,a: [9, 2, 3, [4, 5], 6]
  7. 改变后的值,b: [9, 2, 3, [4, 5], 6]
  8. Process finished with exit code 0

二、浅拷贝(copy.copy())

深拷贝和浅拷贝都需要用到copy包,记得提前导入

  1. """浅拷贝"""
  2. import copy #需要导入copy包
  3. a = [1, 2, 3, [4, 5], 6]
  4. b = copy.copy(a)
  5. print("a的地址:",id(a))
  6. print("b的地址:",id(b))
  7. print("a中各个元素的地址:",list(id(i) for i in a))
  8. print("b中各个元素的地址:",list(id(i) for i in b))
  9. print("#################################")
  10. a[0]=9
  11. print("改变后的值,a:",a)
  12. print("改变后的值,b:",b)
  13. print("#################################")
  14. a[3][0] = 8
  15. print("改变嵌套数据后的值,a:",a)
  16. print("改变变嵌套数据后的值,b:",b)

 运行结果:

  1. a的地址: 2671219558920
  2. b的地址: 2671219558280
  3. a中各个元素的地址: [140728859586832, 140728859586864, 140728859586896, 2671219589960, 140728859586992]
  4. b中各个元素的地址: [140728859586832, 140728859586864, 140728859586896, 2671219589960, 140728859586992]
  5. #################################
  6. 改变后的值,a: [9, 2, 3, [4, 5], 6]
  7. 改变后的值,b: [1, 2, 3, [4, 5], 6]
  8. #################################
  9. 改变后的值,a: [9, 2, 3, [8, 5], 6]
  10. 改变后的值,b: [1, 2, 3, [8, 5], 6]
  11. Process finished with exit code 0

三、深拷贝(copy.deepcopy())

         直观理解:经过深拷贝操作后,前后数据的变化互不影响。

  1. """深拷贝"""
  2. import copy #需要导入copy包
  3. a = [1, 2, 3, [4, [7,8]], 6]
  4. b = copy.deepcopy(a)
  5. print("a的地址:",id(a))
  6. print("b的地址:",id(b))
  7. print("a中各个元素的地址:",list(id(i) for i in a))
  8. print("b中各个元素的地址:",list(id(i) for i in b))
  9. print("#################################")
  10. a[0]=9
  11. print("改变后的值,a:",a)
  12. print("改变后的值,b:",b)
  13. print("#################################")
  14. a[3][0] = 8
  15. print("改变嵌套数据后的值,a:",a)
  16. print("改变变嵌套数据后的值,b:",b)
  17. a[3][1][0] = 8
  18. print("改变嵌套数据后的值,a:",a)
  19. print("改变变嵌套数据后的值,b:",b)

运行结果:

  1. a的地址: 2649326638088
  2. b的地址: 2649331518344
  3. a中各个元素的地址: [140728859586832, 140728859586864, 140728859586896, 2649331517384, 140728859586992]
  4. b中各个元素的地址: [140728859586832, 140728859586864, 140728859586896, 2649326637576, 140728859586992]
  5. #################################
  6. 改变后的值,a: [9, 2, 3, [4, [7, 8]], 6]
  7. 改变后的值,b: [1, 2, 3, [4, [7, 8]], 6]
  8. #################################
  9. 改变嵌套数据后的值,a: [9, 2, 3, [8, [7, 8]], 6]
  10. 改变变嵌套数据后的值,b: [1, 2, 3, [4, [7, 8]], 6]
  11. 改变嵌套数据后的值,a: [9, 2, 3, [8, [8, 8]], 6]
  12. 改变变嵌套数据后的值,b: [1, 2, 3, [4, [7, 8]], 6]
  13. Process finished with exit code 0
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/71487
推荐阅读
相关标签
  

闽ICP备14008679号