欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python for循環(huán)remove同一個list過程解析

 更新時間:2019年08月14日 17:08:32   作者:urey_pp  
這篇文章主要介紹了python for循環(huán)remove同一個list過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

下午在用python將Linux的conf配置文件轉(zhuǎn)化成字典dict時遇到了一個奇怪的問題,原先conf配置文件中沒有注釋行(以#開頭的行),后來為了避免這種情況,添加了一個對以#開頭的行刪除的操作。 實踐結(jié)果顛覆了已有的認知,直接上代碼示例。

代碼片段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

結(jié)果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

# 結(jié)果2:

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

本以為上述兩個代碼的結(jié)果應(yīng)該是一樣的,結(jié)果不一樣。

分析:

原因是不能在for循環(huán)中用remove同一個列表(遍歷中刪除)。當(dāng)remove這個list中的元素時,list的長度發(fā)生了變化,for循環(huán)就會受到影響(這個python版本(2.7.x沒有明顯的報錯,可能作者并不認為這是一個issue或bug,但給點提示也是好的?。?/p>

解決辦法:

用一個新的列表(list)去代替循環(huán)中的list或者代替remove操作的list。在創(chuàng)建新的列表是可以用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

有趣(令人困惑)的是切片也是淺復(fù)制,但利用切片也可以實現(xiàn)上述功能,代碼如下:

#!/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

上述導(dǎo)致錯誤發(fā)生的例子(在for循環(huán)中用remove同一個列表)可以認知為這個操作是修改對象勢必影響此對象,要想修改一個對象卻不影響此對象引用,則需要對象復(fù)制。如果你想修改一個對象,而且想讓原始的對象不受影響,那你就需要對象復(fù)制。

附加知識點:

關(guān)于淺復(fù)制(淺拷貝)

對象的淺復(fù)制(shallow copy):它雖然復(fù)制了對象,但對于對象中的元素,依然使用引用.

(1)、使用切片[:]操作進行拷貝 (注釋:切片只復(fù)制了對象的頂層,對對象的下一層還是引用,舉個例子:[1,2,3,[4,5,6]])

(2)、使用工廠函數(shù)(如list/dir/set)等進行拷貝

(3)、copy.copy()

(4)、=(賦值)操作(注釋:原文沒有,此處是新添加的,根據(jù)“對象的賦值實際上是對象的引用”添加)

如果希望復(fù)制一個容器對象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy這個方法會消耗一些時間和空間。不過,如果你需要完全復(fù)制,這是唯一的方法。

注意:

1、對于非容器類型(如數(shù)字、字符串、和其他‘原子'類型的對象)沒有被拷貝一說。

2、如果元組變量只包含原子類型對象,則不能深copy。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • PowerShell的基本使用方法

    PowerShell的基本使用方法

    本文主要介紹了PowerShell的基本使用方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Python開發(fā)編碼規(guī)范

    Python開發(fā)編碼規(guī)范

    Python開發(fā)編碼規(guī)范...
    2006-09-09
  • 簡單的連接MySQL與Python的Bottle框架的方法

    簡單的連接MySQL與Python的Bottle框架的方法

    這篇文章主要介紹了簡單的連接MySQL與Python的Bottle框架的方法,主要基于mysql-connector插件,需要的朋友可以參考下
    2015-04-04
  • Python技巧分享之groupby基礎(chǔ)用法詳解

    Python技巧分享之groupby基礎(chǔ)用法詳解

    python中g(shù)roupby函數(shù)主要的作用是進行數(shù)據(jù)的分組以及分組后地組內(nèi)運算!本文將通過一些示例和大家詳細講講groupby的基礎(chǔ)用法,需要的可以參考一下
    2022-10-10
  • python實現(xiàn)銀行管理系統(tǒng)

    python實現(xiàn)銀行管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現(xiàn)銀行管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 深入解析Python設(shè)計模式編程中建造者模式的使用

    深入解析Python設(shè)計模式編程中建造者模式的使用

    這篇文章主要介紹了深入解析Python設(shè)計模式編程中建造者模式的使用,建造者模式的程序通常將所有細節(jié)都交由子類實現(xiàn),需要的朋友可以參考下
    2016-03-03
  • python實現(xiàn)碑帖圖片橫向拼接

    python實現(xiàn)碑帖圖片橫向拼接

    這篇文章主要為大家詳細介紹了python實現(xiàn)碑帖圖片橫向拼接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • tesseract庫及訓(xùn)練數(shù)據(jù)下載安裝方式

    tesseract庫及訓(xùn)練數(shù)據(jù)下載安裝方式

    這篇文章主要介紹了tesseract庫及訓(xùn)練數(shù)據(jù)下載安裝方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • opencv 閾值分割的具體使用

    opencv 閾值分割的具體使用

    這篇文章主要介紹了opencv 閾值分割的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 30行Python代碼打造一款簡單的人工語音對話

    30行Python代碼打造一款簡單的人工語音對話

    使用gtts和speech_recognition實現(xiàn)簡單的人工語音對話,通過將語音變成文本,然后文本變成語音,僅用30行代碼,超級簡單,對Python人工語音對話的實現(xiàn)過程及完整代碼感興趣的朋友一起看看吧
    2021-05-05

最新評論