Python中 list[:] 与 list 的区别

最近leetcode刷题的时候,总是碰到最后返回的结果是[[],[],[]…[]]这样的形式,就是说列表中的元素也是列表,我们假设外面的大列表为res,里面的小列表为符合要求的答案,假设为path,当我们程序判断当前一个path符合要求的时候,我们就需要将path添加到res中去(该题目的背景是回溯,path一直会改变),此时就不能使用res.append(path),而必须使用res.append(path[:])。具体的原因其实是浅拷贝与深拷贝的区别。

因为当直接直接使用res.append(path)的时候,是浅拷贝,之后path改变的时候,res大列表中的已经添加的path将会跟着改变,而res.append(path[:])是深拷贝,就算之后path一直改变,已经添加到res大列表中的path不会跟着改变的。

下面是栗子:

# 定义res,定义path
res = []
path = [1, 2, 3]
#假设此时path符合我们的要求,我们需要将path添加入res中
res.append(path)

此时,程序继续往下执行,path被改变的时候,我们其实不希望已经添加到res中的path改变的,但是如果是上述这种浅拷贝形式,path改变,res中的添加过的path也同样会改变。

# 我们首先打印res
print('path改变之前的res', res)
# 接着我们改变path
path.append(4)
# 我们继续打印res
print('path改变之后的res', res)
# 输出
#>>> path改变之前的res [[1, 2, 3]]
#>>> path改变之后的res [[1, 2, 3, 4]]

通过结果,我们可以发现确实res中的path会跟着path的改变而改变,究其原因其实就是浅拷贝,res中的添加过的path与一直需要改变的path指向的内存空间是一样的,既他们的id是一样的,我们可以打印出来。

# 打印一直需要改变的path的id
print(id(path))
# 打印已经添加到res中的path,其不可以继续改变
print(id(res[0]))
# 输出
#>>> 2031046824448
#>>> 2031046824448

通过结果可以发现,确实两个path指向的内存id是一样的,所以后续path改变,res中的path也会同时跟着改变。

而当我们使用res.append(path[:]),则将会是深拷贝,既id将会不同,path改变,res中已经添加的path也不会跟着改变。还是刚才的栗子:

# 深拷贝
res.append(path[:])
# 检查两个path的id是否一样
print(id(res[1]))# 这是刚刚这个添加方式的id,因为前面已经添加过一次,所以这边索引是1
print(id(path))# 需要一直改变的path的id
print(id(res[0]))# 浅拷贝的res中的path的id
# 输出
# 2031046831680
# 2031046824448
# 2031046824448

通过结果,可以证明我们上面的说法,接着我们再修改path,就会看见区别,res中的第一个path是会跟着改变的,而第二个path将不会改变。

# 首先打印此时的res
print('path改变之前的res', res)
# 改变path
path.append(5)
# 首先打印此时的res
print('path改变之后的res', res)
# 输出
# path改变之前的res [[1, 2, 3, 4], [1, 2, 3, 4]]
# path改变之后的res [[1, 2, 3, 4, 5], [1, 2, 3, 4]]

结果与我们的想法一样。其实就是浅拷贝与深拷贝的区别。

Python中 list[:]与 list 的区别相关推荐

  1. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  2. python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...

    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...

  3. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  4. python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...

    [摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...

  5. python中函数和方法的区别

    本篇内容主要介绍从几个维度来介绍下python中函数和方法的区别: 首先,从分类的角度来分析. (1)函数的分类: 内置函数:python内嵌的一些函数. 匿名函数:一行代码实现一个函数功能. 递归函 ...

  6. Python 中各种imread函数的区别与联系

    Python 中各种imread函数的区别与联系 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误.如 ...

  7. Python中深拷贝与浅拷贝的区别?

    往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...

  8. 【Python面试】 说说Python中xrange和range的区别?

    往期面试题: 谈谈对 Python 和其他语言的区别? 说说4种常用编码的区别? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 废话不多说,开始今天的题目: 问:说说Pyth ...

  9. python中函数和类的区别_Python中函数和方法的区别

    简单总结: 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(method). 首先摒弃错误认知:并不是类中的调用都叫方法 函数 ...

  10. python中int和eval的区别_python中eval与int的区别浅析

    python中eval和int的区别是什么?下面给大家介绍一下: 1.eval()函数 eval()能够以Python表达式的方式解析并执行字符串,并将返回结果输出.eval()函数将去掉字符串的两个 ...

最新文章

  1. LeetCode简单题之删除一个元素使数组严格递增
  2. JAVA中jsp怎么接收参数_如何使用JSP从URL获取参数
  3. java ee开发技术 上海大学_学院介绍
  4. 自定义Spark Partitioner提升es-hadoop Bulk效率——续
  5. apache的防DDOS模块-mod_evasive
  6. 2 shell 锂基脂_壬二酸和癸二酸制备的复合锂基脂到底有那些差别!
  7. WPF:Graphics绘图--Shapes形状
  8. 正则表达式的使用,python正则匹配一个话题标签
  9. 关于Java String对象创建问题解惑
  10. 华为机试HJ17:坐标移动
  11. 敌退我进 锂电产业链中日韩三国演义
  12. d盘不见了 计算机打不开,D盘不见了怎么找回 电脑D盘没了解决方法
  13. Spring Boot 2 基础篇学习笔记
  14. 学编程c语言高考能加分吗,编程已列入中高考,孩子升学加分的机会你抓住了么?...
  15. 设计模式学习之工厂方法模式
  16. SMAA算法详解 - SMAADetectVerticalCornerPattern
  17. phpmywind 常用函数 整理中……
  18. UBUNTU16.04使用CornerNet_Lite进行目标识别并嵌入到ROS中
  19. 由国内媒体的“非典”报道看信息生态问题-引文
  20. 利用计算机求解一个实际问题的步骤是,数学在计算机科学的应用.doc

热门文章

  1. python画猫和老鼠_利用python如何实现猫捉老鼠小游戏
  2. 深度deep Linux系统软件应用商店下载地址
  3. rocksdb的基本操作
  4. Unity+Vuforia+Hololens2 AR开发
  5. Android适配--dimen
  6. java查看端口号被占用的命令_linux下怎么查看哪些端口被占用
  7. 深入理解计算机系统-之-数值存储(二)--C程序打印变量的每一字节或者位
  8. 主从博弈论文中关于均衡解证明的写作总结
  9. ORB-SLAM2 ---- Tracking::Relocalization函数
  10. 刀片服务器在哪看cpu型号,了解认识刀片服务器