zoukankan      html  css  js  c++  java
  • Python 列表复制

    Python 列表复制

    关于Python 列表的复制,有多种方法,常用的 有 赋值、切片、list、copy,copy.deepcopy等。

    但是 实际用时 又有区别,不小心可能就用错了。

    接下来 简单举例 说明一下 使用

    import  copy
    
    a = [1,2,3,4]
    b = a
    c = a[:]
    d = a.copy()
    e = copy.copy(a)
    f = copy.deepcopy(a)
    g = list(a)
    print('id(a):%d,id(b):%d' % (id(a),id(b)))print('id(c):%d' % (id(c)))
    print('a:%s,b:%s,c%s'%(a,b,c))
    a[2] = 5
    del a[3]
    print('a:%s,b:%s,c%s'%(a,b,c))
    print('id(d):%d' % (id(d)))
    print('d:%s' % d)
    print('id(e):%d' % (id(e)))
    print('e:%s' % e)
    print('id(f):%d' % (id(f)))
    print('f:%s' % f)
    print('id(g):%d' % (id(g)))
    print('g:%s' % g)

    执行 结果如下

    id(a):4409071368,id(b):4409071368
    id(c):4409070344
    a:[1, 2, 3, 4],b:[1, 2, 3, 4],c[1, 2, 3, 4]
    a:[1, 2, 5],b:[1, 2, 5],c[1, 2, 3, 4]
    # 以上可知 a、b id 一致,改变a 则 b 也会改变
    # 一下 id 则都不相同 
    id(d):4408193736
    d:[1, 2, 3, 4]
    id(e):4409091336
    e:[1, 2, 3, 4]
    id(f):4409091400
    f:[1, 2, 3, 4]
    id(g):4409091080
    g:[1, 2, 3, 4]

    换一种 内嵌列表的列表复制

    names = ["小明", "小红", ["张三", "李四", "王五"], "小黑", "小黄", "小白"]
    # 复制一份列表
    names2 = names.copy()
    # 把李四 改成英文
    names[2][1] = "Lisi"
    print(names)
    print(names2)
    # 执行结果
    ['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']
    ['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']

    这段代码的运行结果是,两个列表的李四都变成了英文,来分析一下原理

    其实这个图也挺简单的,就是中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的names2 也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。

    也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。

    补充:第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用 

    实现浅复制的三种方法

    import copy
    
    names = ["小明", "小红", "小黑", "小黄", "小白"]
    # 浅copy 1.
    names1 = copy.copy(names)
    # 2.
    names2 = names[:]
    # 3. 工厂函数
    names3 = list(names)

    深复制的方法 

    import copy
    
    names = ["小明", "小红", "小黑", ["粉色"], "小黄", "小白"]
    # 深复制
    deep_names = copy.deepcopy(names)
    # 修改粉色为 Pink
    names[3][0] = "Pink"
    # 分别打印输出两个列表
    print(names)
    print(deep_names)
    # 输出结果为:
    
    ['小明', '小红', '小黑', ['Pink'], '小黄', '小白']
    ['小明', '小红', '小黑', ['粉色'], '小黄', '小白']

    如下例

    a = [[10], 20]
    b = a[:]
    c = list(a)
    d = a * 1
    e = copy.copy(a)
    f = copy.deepcopy(a)
    a.append(21)
    a[0].append(11)
    
    print (id(a), a)
    # 4317123656 [[10, 11], 20, 21]
    print (id(b), b)
    # 4317123592 [[10, 11], 20]
    print (id(c), c)
    # 4317123848 [[10, 11], 20]
    print (id(d), d)
    # 4317082888 [[10, 11], 20]
    print (id(e), e)
    # 4317123720 [[10, 11], 20]
    print (id(f), f)
    # 4317123784 [[10], 20]
  • 相关阅读:
    1. centos7 的安装
    编写java 程序与Linux进行远程连接并运行linux下的脚本
    java 利用辗除法求两个整数的最大公约数和最小公倍数
    java 给不同成绩分等级
    java 分解质因数
    java中导入 导出
    Mysql 常用命令
    mysql 创建联合主键
    mysql注释
    mysql管理工具navicat的快捷键
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/10319421.html
Copyright © 2011-2022 走看看