zoukankan      html  css  js  c++  java
  • python 列表复制问题

    引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子:

    问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制

    a=[1,2]
    b=a

    这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。

    解决的方法为:

    a=[1,2]
    b=a[:]

    这样修改a对b没有影响。修改b对a没有影响。

    但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。为了证明这一点,测试步骤如下:

    >>> a=[1,[2]]
    >>> b=a[:]
    >>> b
    [1, [2]]
    >>> a[1].append(3)
    >>> a
    [1, [2, 3]]
    >>> b
    [1, [2, 3]]

    可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:

    >>> import copy
    >>> a=[1,[2]]
    >>> b=copy.deepcopy(a)
    >>> b
    [1, [2]]
    >>> a[1].append(3)
    >>> a
    [1, [2, 3]]
    >>> b
    [1, [2]]

    有时候知道这一点是非常重要的,因为可能你的确需要一个新的列表,并且对这个新的列表进行操作,同时不想影响原来的列表。

    下面就是一个浅拷贝的例子。

    >>> a = [1, 2, 3]
    >>> b = [1, 2, 3]
    >>> # MISSING CODE HERE
    >>> print(a, b)
    [1, 'A', 3] [1, 'A', 3]
    有一个选项如下:
    b[1] = 'AB'
    a[1] = a[1][0]

    开始我没选,看到答案之后我运行了一遍不对。后来才发现没有一起运行。我先改的是b[1],然后查看b当然会是[1,'AB',3]两个一起都运行了之后就是正确的结果。看了上面关于深拷贝和浅拷贝的区别后,明白了。这里是浅拷贝,所以a改变会影响到b,b改变也会影响到a.



  • 相关阅读:
    Windows服务BAT命令-安装、卸载、启动、停止
    身份认证
    密钥管理概述
    快速上手几个Linux命令
    递归
    数字签名的实现方案
    数字签名
    密码学基础
    你可以把Linux内核当成一家软件外包公司的老板
    数学归纳法
  • 原文地址:https://www.cnblogs.com/ahujack/p/3061164.html
Copyright © 2011-2022 走看看