对python append 与浅拷贝的实例讲解


Posted in Python onMay 04, 2018

在做Leetcode的第39题的时候,看到网上一个用递归的解法,很简洁。于是重写了一遍。

class Solution(object):
 def combinationSum(self, candidates, target):
 """
 :type candidates: List[int]
 :type target: int
 :rtype: List[List[int]]
 """
 result,temp = [],[]
 self.combinationSumRecu(sorted(candidates),result,0,temp,target)
 return result

 def combinationSumRecu(self, candidates, result, start, temp, target):
 if target == 0:
  result.append(temp) # 注意此处不能直接append(temp),否则是浅拷贝,之后temp.pop()时会将result中的数也pop出来
 while start < len(candidates) and candidates[start]<=target:
  temp.append(candidates[start])
  self.combinationSumRecu(candidates, result, start, temp,target-candidates[start])
  temp.pop()
  start += 1

if __name__ == '__main__':
 print Solution().combinationSum([2,3,6,7],7)

一开始没看懂combinationSumRecu中的result.append(list(temp))为什么temp要加list,因为temp本身就是一个list。但是把list去掉后,结果就出现错误。

没改前,结果是:

[[2, 2, 3], [7]]

改成result.append(temp)后:

[[], []]

为什么会这样呢?list在这里做了什么工作呢?

首先,为了验证temp每步都是一个list,我们是使用type()函数查看它的类型。

if target == 0: 
 print type(temp),temp,result 
 result.append(temp)

输出为:

<type 'list'> [2, 2, 3] []
<type 'list'> [7] [[7]]

可以看出,temp都是list。但是第二个result的结果不正确

可以将正确的值输出对比一下

if target == 0: 
 print type(temp),temp,result 
 result.append(list(temp))

输出为:

<type 'list'> [2, 2, 3] []
<type 'list'> [7] [[7]]

可以看出,本来第二个result应该为[[2,2,3]],结果变成了[[7]].

于是猜想可能是append()浅拷贝问题。

append(temp)后又在后面进行temp.pop()操作。result实际上append的是temp的引用。当temp所指向的地址的值发生改变时,result也会跟着改变。

举个例子验证一下:

a = [1,2] 
b = [3,4] 
a.append(b) 
print a 
b.pop() 
print a

输出结果为:

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

要解决这个问题,需要对temp进行深拷贝后append到result中。而list(temp)就会返回temp的一个深拷贝。

除了用list(temp)以外,还可以用temp[:]进行深拷贝。

以上这篇对python append 与浅拷贝的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python显示生日是星期几的方法
May 27 Python
python的多重继承的理解
Aug 06 Python
python实现k-means聚类算法
Feb 23 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
cmd运行python文件时对结果进行保存的方法
May 16 Python
对Tensorflow中的矩阵运算函数详解
Jul 27 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
python如何实现视频转代码视频
Jun 17 Python
Django密码系统实现过程详解
Jul 19 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
python中的random模块和相关函数详解
Apr 22 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 Python
浅谈Python中重载isinstance继承关系的问题
May 04 #Python
对Python 2.7 pandas 中的read_excel详解
May 04 #Python
Python3读取Excel数据存入MySQL的方法
May 04 #Python
详解Django之admin组件的使用和源码剖析
May 04 #Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 #Python
使用python3+xlrd解析Excel的实例
May 04 #Python
对python中的xlsxwriter库简单分析
May 04 #Python
You might like
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
php不用正则验证真假身份证
2013/11/06 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
用vue写一个日历
2020/11/02 Javascript
用实例解释Python中的继承和多态的概念
2015/04/27 Python
在Python中编写数据库模块的教程
2015/04/29 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
使用TensorFlow实现SVM
2018/09/06 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
物流专业求职计划书
2014/01/10 职场文书
化学教师教学反思
2014/01/17 职场文书
集体婚礼策划方案
2014/02/22 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
财务人员入职担保书
2015/09/22 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android