对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

作者:lc_lc2000 时间:2023-06-04 19:17:50 

对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

列表赋值:


>>> a = [1, 2, 3]
>>> b = a
>>> print b
[1, 2, 3]
>>> a[0] = 0
>>> print b
[0, 2, 3]

解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变

如果希望b不改变,可以用到切片


>>> b = a[:]
>>> a[0] = 0
>>> print b
[1, 2, 3]

解释,切片a[:]会产生一个新的对象,占用一块新的内存,b指向这个新的内存区域,因此改变a所指向的对象的值,不会影响b

列表深拷贝和浅拷贝

浅拷贝


>>> import copy
>>> a = [1, 2, 3, [5, 6]]
>>> b = copy.copy(a)
>>> print b
[1, 2, 3, [5, 6]]
>>> a[3].append('c')
>>> print b
[1, 2, 3, [5, 6, 'c']]

深拷贝


>>> a = [1, 2, 3, [5, 6]]
>>> b = copy.deepcopy(a)
>>> a[3].append('c')
>>> print b
[1, 2, 3, [5, 6]]

拷贝即是开辟一块新的内存空间,把被拷贝对象中的值复制过去。而浅拷贝并没有为子对象[5,6]开辟一块新的内存空间,而仅仅是实现对a中[5,6]的引用。所以改变a中[5,6]的值,b中的值也会发生变化。

深拷贝则是为子对象也开辟了一块新空间。所以改变a中[5, 6]的值,并不影响b

数组赋值不能用切片来达到相同的目的


>>> import numpy as np
>>> a = np.array([1, 2 ,3])
>>> b = a[:]
>>> a[0] = 5
>>> print a, b
[5 2 3] [5 2 3]

如上,虽然用切片,但不能达到修改a而不影响b的目的。说明a,b仍然指向同一块内存。

此时,只能用拷贝


>>> b = a.copy()
>>> a[0] = 5
>>> print a, b
[5 2 3] [1 2 3]

此时修改a不会影响到b。其中的原因以后进一步深究。

注意,列表的拷贝是copy.copy(obj)或copy.deepcopy(obj),数组的拷贝是obj.copy()

来源:https://blog.csdn.net/lc_lc2000/article/details/53135839

标签:赋值,浅拷贝,深拷贝
0
投稿

猜你喜欢

  • Python学习之自定义异常详解

    2021-05-05 18:46:20
  • 使用Python爬虫爬取小红书完完整整的全过程

    2022-03-23 05:12:44
  • MySQL复制的概述、安装、故障、技巧、工具

    2011-04-11 08:36:00
  • Python 自动化处理Excel和Word实现自动办公

    2021-06-07 06:41:16
  • javascript面向对象编程(三)

    2008-03-07 13:19:00
  • python3 logging日志封装实例

    2022-05-23 08:27:52
  • Navicat For MySQL的简单使用教程

    2024-01-17 12:22:02
  • JavaScript代码执行的先后顺序问题

    2024-04-29 13:45:54
  • 支付宝 接口开发帮助(asp,php,asp.net,jsp)

    2024-05-21 10:11:35
  • pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法

    2022-02-26 16:18:37
  • 浅谈spring boot 集成 log4j 解决与logback冲突的问题

    2023-06-22 13:12:05
  • IA学习笔记02:组织体系

    2009-06-12 12:22:00
  • 全面解析Bootstrap中tab(选项卡)的使用方法

    2024-05-03 15:03:48
  • Python 中的pass语句语法详析

    2023-02-11 03:17:44
  • 关于js遍历表格的实例

    2024-04-18 09:29:21
  • go语言代码生成器code generator使用示例介绍

    2024-05-21 10:19:29
  • [教程]用代码让你了解网页与键盘

    2008-06-10 12:18:00
  • MySQL查询冗余索引和未使用过的索引操作

    2024-01-22 22:04:23
  • 详解重置Django migration的常见方式

    2022-10-30 13:21:17
  • Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程

    2021-03-14 09:16:22
  • asp之家 网络编程 m.aspxhome.com