概述

在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等绕口的名词到底有什么区别和作用呢?

列表赋值

# 定义一个新列表

l1 = [1, 2, 3, 4, 5]

# 对l2赋值

l2 = l1

print(l1)

l2[0] = 100

print(l1)

示例结果:

[1, 2, 3, 4, 5]

[100, 2, 3, 4, 5]

可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的“复制”,在Python中,列表属于可变对象,而对可变对象的复制其实就是将列表的内存空间类似C中的指针再次指向新的变量名,而不是诸如字符串这种不可变对象在复制时会创建新的内存空间进行赋值。即此时L1和L2指向的是同一片内存空间,那么怎么实现真正复制呢?

浅拷贝

当列表中的元素为不可变对象时,我们可以用以下方法对列表进行赋值:

import copy

# 定义一个新列表

L0 = [1, 2, 3, 4, 5]

print(L0)

print('-'*40)

利用切片

L1 = L0[:]

L1[0] = 100

print(L0)

利用模块copy

import copy

L2 = copy.copy(L0)

L2[0] = 100

print(L0)

利用list()

L3 = list(L0)

L3[0] = 100

print(L0)

利用列表方法extend

L4 = []

L4.extend(L0)

L4[0] = 100

print(L0)

利用列表推导

L5 = [i for i in L0]

L5[0] = 100

print(L0)

可以看到最终的打印结果都是[1, 2, 3, 4, 5],我们成功进行了列表的复制,但是为了条件需要是列表中元素为不可变对象呢? 因为如果列表中的元素为可变对象,在复制时有会发生对象的引用,而不是新建内存空间进行引用,比如:

L0 = [1, 2, [3], 4, 5]

print(L0)

L2 = L0[:]

L2[2][0] = 100

print(L0)

示例结果:

[1, 2, [3], 4, 5]

[1, 2, [100], 4, 5]

可以看到,当列表L0中含有可变对象时,对复制后的L1进行改变其中可变对象元素L2[2]时,L0中的可变对象L0[2]也发生了改变,那么怎么实现真正的完全的拷贝呢?

深拷贝

利用copy模块中的deepcopy进行深拷贝:

import copy

L0 = [1, 2, [3], 4, 5]

print(L0)

L2 = copy.deepcopy(L0)

L2[2][0] = 100

print(L2)

print(L0)

示例结果:

[1, 2, [100], 4, 5]

[1, 2, [3], 4, 5]

总结

以上所述是小编给大家介绍的详解Python列表赋值复制深拷贝及5种浅拷贝,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝相关推荐

  1. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  2. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  3. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  4. python中filepath路径怎么写_详解Python中的路径问题

    1. 绝对路径引入 Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止.下面命令可以查看当前的搜索路径: import sys print(sys.path) sys.pa ...

  5. python正则匹配空格+数字+空格_详解Python中正则匹配TAB及空格的小技巧

    详解Python中正则匹配TAB及空格的小技巧 发布时间:2020-10-15 08:38:48 来源:脚本之家 阅读:94 作者:杰瑞26 在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任 ...

  6. python中yaml模块的使用_详解Python yaml模块

    一.yaml文件介绍 yaml是一个专门用来写配置文件的语言. 1. yaml文件规则 区分大小写: 使用缩进表示层级关系: 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元 ...

  7. python中fp是什么意思_详解python实现FP-TREE进行关联规则挖掘(带有FP树显示功能)附源代码下载(3)...

    详解python实现FP-TREE进行关联规则挖掘(带有FP树显示功能)附源代码下载(3) 上一节简单讲了下FP树的生成,在这一节我将描述FP树的挖掘过程. 首先我们回顾一下要挖掘的特征项及样本空间: ...

  8. 详解python运行三种方式_详解python运行三种方式

    方式一 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ p ...

  9. python中的符号下划线_详解Python中下划线的使用方法

    编程派微信号:codingpy 这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线 _ 的不同用法绝大部分(不全是)都是一种惯例约定. 单个下划线(_) 主要有三种情况: ...

最新文章

  1. VS C++调用python进行画图matplotlib
  2. 算法训练 未名湖边的烦恼
  3. VTK:冰激凌用法实战
  4. JS 中 indexOf 的用户及注意事项
  5. 上拉加载更多后台数据_微信小程序端操作云数据库
  6. Android应用开发—FragmentManager如何管理fragments
  7. csp认证多少分通过_一级结构工程师考试难不难?多少分通过?
  8. Maven 私服 Version policy mismatch, cannot upload SNAPSHOT content to RELEASE repositories for file‘0’
  9. PyTorch 入坑十一: 损失函数、正则化----深刻剖析softmax+CrossEntropyLoss
  10. Java开发笔记(一百四十)JavaFX的选择框
  11. ADSL路由切换IP
  12. c#迁移文件的时候提示:对路径xxx的访问被拒绝
  13. 硬盘的老化测试软件,扩容卡检测、扩容U盘检测工具(MyDiskTest)
  14. Elasticsearch(三)使用 Kibana 操作 ES
  15. IE8 Automation 服务器不能创建对象 解决方法
  16. 模拟信号如何转换为数字信号
  17. Linux网卡驱动分析
  18. 大白菜装机版一键制作启动u盘教程
  19. 猎聘网2017年校园招聘研发类岗位笔试题
  20. 千氪公开课第一期|如何实现写作收益的最大化?-千氪

热门文章

  1. GoLang MySQL CRUD Example
  2. 如何在Windows上安装Angular:Angular CLI,Node.js和构建工具指南
  3. javascript中索引_如何在JavaScript中找到数字在数组中所属的索引
  4. 117_PowerQuery使用ODBC访问带密码的Access
  5. python文本菜单程序_从〇到一: Python GUI 程序:记事本
  6. Django查询数据
  7. 小哥哥你有98K吗?利用Python制作一款多功能变声器!
  8. 字典按照值或键进行排序
  9. Flink SQL CDC 上线!我们总结了 13 条生产实践经验
  10. Pandas知识点-Series数据结构介绍