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]

Python 列表复制的更多相关文章

  1. python 列表复制给另一个列表,改值两个列表均会改变(备忘)

    http://blog.csdn.net/lc_lc2000/article/details/53135839 本意是使A = B,B为一个列表,结果在后续对A的操作中,导致B中的值也改变了,才回忆起 ...

  2. Python 列表切片陷阱:引用、复制与深复制

    Python 列表的切片和赋值操作很基础,之前也遇到过一些坑,以为自己很懂了.但今天刷 Codewars 时发现了一个更大的坑,故在此记录. Python 列表赋值:复制"值"还是 ...

  3. Python之复制列表

    将一个列表的数据复制到另外一个列表中. 1 a = [1,2,3] #定义列表a 2 3 b = a[:] #将列表a的切片赋值给b,也可以理解为将b的值设置为a[:] 4 5 print(a) #打 ...

  4. Python列表、元组、字典和字符串的常用函数

    Python列表.元组.字典和字符串的常用函数 一.列表方法 1.ls.extend(object) 向列表ls中插入object中的每个元素,object可以是字符串,元组和列表(字符串“abc”中 ...

  5. [转载] Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  6. (转载)Python 列表(list)操作

    (转载)http://blog.csdn.net/facevoid/article/details/5338048 创建列表sample_list = ['a',1,('a','b')] Python ...

  7. Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  8. python列表的一些常用方法以及函数

    学习到了一些关于python列表的新知识,自己整理了一下,方便大家参考: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # File_type:列表的常用操 ...

  9. Python列表操作集合

    对于python列表里元素的操作主要分为以下几个方面: 1.向列表里面加元素: 向python列表里面添加元素主要有三种方法: (1)append() append()对于列表的操作主要实现的是在特定 ...

随机推荐

  1. 02: git分支管理

    目录:GIT其他篇 01: git & github 02: git分支管理 目录: 1.1 Git常用命令 1.2 主要分支(保护分支) 1.3 特性分支:feature (开发分支合并到d ...

  2. mint-ui之Loadmore使用

    <template> <div class="page-loadmore"> <div class="page-loadmore-wrapp ...

  3. centos7 挂载磁盘设置开机自启动

    1.首先查看系统磁盘情况: 2.格式化自己想要挂载的磁盘类型(ext3 ext4现在主要使用的是这些) 3.查看自己格式化磁盘的uuid(使用UUID挂载是唯一标识安全) 4.复制UUID号(别复制双 ...

  4. 【python014--字符串内置函数】

    一.实现跨越多行的字符串 1.采用双引号实现 str1 = ""待我长发及腰,将军归来可好?此身君子意逍遥,怎料山河萧萧天光乍破遇,暮雪白头老寒剑默听奔雷,长枪独守空豪醉卧沙场君莫 ...

  5. selenium css定位方式

  6. 总结: 在fc23中, 安装音频mp3 视频flv 的播放插件其实很简单, 只要一步就可以了: dnf install gstreamer1-libav

    同样是 firefox, 单词的在线发音, 跟 百度mp3的在线播放不是一样的!!! 百度/优酷 的在线播放, 用的确实是 flash player , 所以 你安装好libflashplayer后, ...

  7. nohup 让进程在后台可靠运行的几种方法

    1. nohup nohup 无疑是我们首先想到的办法.顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号. nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即 ...

  8. P2517 [HAOI2010]订货

    思路 费用流水题 对每月拆点,入点向出点连cap=ui的边,s向入点连cost=di的边,i的入点向i+1的入点连cap=S的边即可 代码 #include <cstdio> #inclu ...

  9. 深度学习课程笔记(十)Q-learning (Continuous Action)

    深度学习课程笔记(十)Q-learning (Continuous Action) 2018-07-10 22:40:28 reference:https://www.youtube.com/watc ...

  10. POJ 1426 Find The Multiple(寻找倍数)

    POJ 1426 Find The Multiple(寻找倍数) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 Given ...