对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 greenlet实现原理和使用示例
Sep 24 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Django之无名分组和有名分组的实现
Apr 16 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
Python实用库 PrettyTable 学习笔记
Aug 06 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
pytorch常见的Tensor类型详解
Jan 15 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
Django 实现jwt认证的示例
Apr 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 常用字符串函数总结
2008/03/15 PHP
php执行sql语句的写法
2009/03/10 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
php微信开发之关注事件
2018/06/14 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
关于jQuery object and DOM element
2013/04/15 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
vuex实现简易计数器
2016/10/27 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
详解webpack+express多页站点开发
2017/12/22 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
python画双y轴图像的示例代码
2019/07/07 Python
python解析yaml文件过程详解
2019/08/30 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
《凡卡》教学反思
2014/04/09 职场文书
查摆剖析材料范文
2014/09/30 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
优秀创业计划书分享
2019/07/19 职场文书
golang json数组拼接的实例
2021/04/28 Golang
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python