zoukankan      html  css  js  c++  java
  • 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    引用:https://www.jb51.net/article/142775.htm

    列表赋值:

    1
    2
    3
    4
    5
    6
    7
    >>> 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不改变,可以用到切片

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

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

    列表深拷贝和浅拷贝

    浅拷贝

    1
    2
    3
    4
    5
    6
    7
    8
    >>> 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']]

    深拷贝

    1
    2
    3
    4
    5
    >>> 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

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

    1
    2
    3
    4
    5
    6
    >>> 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仍然指向同一块内存。

    此时,只能用拷贝

    1
    2
    3
    4
    >>> 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()

    以上这篇对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    见贤思齐,见不贤而自省
  • 相关阅读:
    JS实现添加至购物车功能
    python定制数据类型(继承与授权)两种方式
    模拟数据,控制账号
    绑定知识拓展
    面向对象之多态练习
    面向对象之继承与派生(学生管理系统)
    面向对象之组合(学生管理系统)
    一次小的上机试题
    面向对象之self classmethod staticmethod
    haproxy.conf文件操作(基于函数方式)
  • 原文地址:https://www.cnblogs.com/Sweepingmonk/p/11599297.html
Copyright © 2011-2022 走看看