python for循环remove同一个list过程解析


Posted in Python onAugust 14, 2019

下午在用python将Linux的conf配置文件转化成字典dict时遇到了一个奇怪的问题,原先conf配置文件中没有注释行(以#开头的行),后来为了避免这种情况,添加了一个对以#开头的行删除的操作。 实践结果颠覆了已有的认知,直接上代码示例。

代码片段1

#!/usr/bin/python 
# encoding: utf-8  
# -*- coding: utf8 -*-  
import re  
list_to_test = ['# ', '# conf', 'NAME="Ubuntu"', 'VERSION="14.04.3 LTS, Trusty Tahr"']  
for member in list_to_test:  
 if re.search('^#+.*', member) is not None:  
  list_to_test.remove(member)  
print list_to_test

结果1:

['# conf', 'NAME="Ubuntu"', 'VERSION="14.04.3 LTS, Trusty Tahr"']

代码片段2

#!/usr/bin/python 
# encoding: utf-8  
# -*- coding: utf8 -*-  
list_to_test = ['# ', '# conf', 'NAME="Ubuntu"', 'VERSION="14.04.3 LTS, Trusty Tahr"']  
list_to_test.remove('# ')  
list_to_test.remove('# conf')  
print list_to_test

# 结果2:

['NAME="Ubuntu"', 'VERSION="14.04.3 LTS, Trusty Tahr"']

本以为上述两个代码的结果应该是一样的,结果不一样。

分析:

原因是不能在for循环中用remove同一个列表(遍历中删除)。当remove这个list中的元素时,list的长度发生了变化,for循环就会受到影响(这个python版本(2.7.x没有明显的报错,可能作者并不认为这是一个issue或bug,但给点提示也是好的啊)。

解决办法:

用一个新的列表(list)去代替循环中的list或者代替remove操作的list。在创建新的列表是可以用cpoy模块中的deepcopy方法也可以用new_list = old_list[:]的方法,如下:

#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
import re
from copy import deepcopy

old_list = ['# ', '# conf', 'NAME="Ubuntu"', 'VERSION="14.04.3 LTS, Trusty Tahr"']
new_list = deepcopy(old_list)
for member in new_list:
 if re.search('^#+.*', member) is not None:
  old_list.remove(member)
print old_list

有趣(令人困惑)的是切片也是浅复制,但利用切片也可以实现上述功能,代码如下:

#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
import re
old_list = ['# ', '# conf', 'NAME="Ubuntu"', 'VERSION="14.04.3 LTS, Trusty Tahr"']
new_list = old_list[:]
for member in new_list:
 if re.search('^#+.*', member) is not None:
  old_list.remove(member)
print old_list

上述导致错误发生的例子(在for循环中用remove同一个列表)可以认知为这个操作是修改对象势必影响此对象,要想修改一个对象却不影响此对象引用,则需要对象复制。如果你想修改一个对象,而且想让原始的对象不受影响,那你就需要对象复制。

附加知识点:

关于浅复制(浅拷贝)

对象的浅复制(shallow copy):它虽然复制了对象,但对于对象中的元素,依然使用引用.

(1)、使用切片[:]操作进行拷贝 (注释:切片只复制了对象的顶层,对对象的下一层还是引用,举个例子:[1,2,3,[4,5,6]])

(2)、使用工厂函数(如list/dir/set)等进行拷贝

(3)、copy.copy()

(4)、=(赋值)操作(注释:原文没有,此处是新添加的,根据“对象的赋值实际上是对象的引用”添加)

如果希望复制一个容器对象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy这个方法会消耗一些时间和空间。不过,如果你需要完全复制,这是唯一的方法。

注意:

1、对于非容器类型(如数字、字符串、和其他‘原子'类型的对象)没有被拷贝一说。

2、如果元组变量只包含原子类型对象,则不能深copy。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python多进程编程技术实例分析
Sep 16 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
python爬取网页转换为PDF文件
Jun 07 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
Python3中函数参数传递方式实例详解
May 05 Python
关于Pytorch的MLP模块实现方式
Jan 07 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
Python参数传递及收集机制原理解析
Jun 05 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 #Python
django之自定义软删除Model的方法
Aug 14 #Python
python实现登录密码重置简易操作代码
Aug 14 #Python
python 定时器每天就执行一次的实现代码
Aug 14 #Python
Django 项目重命名的实现步骤解析
Aug 14 #Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 #Python
python 叠加等边三角形的绘制的实现
Aug 14 #Python
You might like
PHP缓存技术的使用说明
2011/08/06 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
jupyter安装小结
2016/03/13 Python
Python数据操作方法封装类实例
2017/06/23 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
护理专业个人求职简历的自我评价
2013/10/13 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
DE1103使用报告
2022/04/05 无线电