对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中的super()方法使用简介
Aug 14 Python
利用python发送和接收邮件
Sep 27 Python
python实现逻辑回归的方法示例
May 02 Python
Python实现读取并保存文件的类
May 11 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
利用python 读写csv文件
Sep 10 Python
Python类class参数self原理解析
Nov 19 Python
一文搞懂如何实现Go 超时控制
Mar 30 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
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
Overload和Override的区别
2012/09/02 面试题
日语求职信范文
2013/12/17 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
初中同学聚会感言
2014/02/11 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
打架检讨书范文
2015/01/27 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
PyTorch中的torch.cat简单介绍
2022/03/17 Python