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中列表和数组的赋值,浅拷贝和深拷贝的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    见贤思齐,见不贤而自省
  • 相关阅读:
    jsp转向
    什么是 XDoclet?
    tomcat中的几点配置说明
    mysql5问题
    POJ 3734 Blocks
    POJ 2409 Let it Bead
    HDU 1171 Big Event in HDU
    POJ 3046 Ant Counting
    HDU 2082 找单词
    POJ 1286 Necklace of Beads
  • 原文地址:https://www.cnblogs.com/Sweepingmonk/p/11599297.html
Copyright © 2011-2022 走看看