最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

分析:

原因是不能在for循環(huán)中用remove同一個(gè)列表(遍歷中刪除)。當(dāng)remove這個(gè)list中的元素時(shí),list的長(zhǎng)度發(fā)生了變化,for循環(huán)就會(huì)受到影響(這個(gè)python版本(2.7.x沒(méi)有明顯的報(bào)錯(cuò),可能作者并不認(rèn)為這是一個(gè)issue或bug,但給點(diǎn)提示也是好的?。?。

解決辦法:

用一個(gè)新的列表(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ù)制,但利用切片也可以實(shí)現(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)致錯(cuò)誤發(fā)生的例子(在for循環(huán)中用remove同一個(gè)列表)可以認(rèn)知為這個(gè)操作是修改對(duì)象勢(shì)必影響此對(duì)象,要想修改一個(gè)對(duì)象卻不影響此對(duì)象引用,則需要對(duì)象復(fù)制。如果你想修改一個(gè)對(duì)象,而且想讓原始的對(duì)象不受影響,那你就需要對(duì)象復(fù)制。

附加知識(shí)點(diǎn):

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

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

(1)、使用切片[:]操作進(jìn)行拷貝 (注釋?zhuān)呵衅粡?fù)制了對(duì)象的頂層,對(duì)對(duì)象的下一層還是引用,舉個(gè)例子:[1,2,3,[4,5,6]])

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

(3)、copy.copy()

(4)、=(賦值)操作(注釋?zhuān)涸臎](méi)有,此處是新添加的,根據(jù)“對(duì)象的賦值實(shí)際上是對(duì)象的引用”添加)

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

注意:

1、對(duì)于非容器類(lèi)型(如數(shù)字、字符串、和其他‘原子'類(lèi)型的對(duì)象)沒(méi)有被拷貝一說(shuō)。

2、如果元組變量只包含原子類(lèi)型對(duì)象,則不能深copy。

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

相關(guān)文章

  • python3 動(dòng)態(tài)模塊導(dǎo)入與全局變量使用實(shí)例

    python3 動(dòng)態(tài)模塊導(dǎo)入與全局變量使用實(shí)例

    今天小編就為大家分享一篇python3 動(dòng)態(tài)模塊導(dǎo)入與全局變量使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn)

    Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn)

    本文主要介紹了Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • python數(shù)據(jù)分析之時(shí)間序列分析詳情

    python數(shù)據(jù)分析之時(shí)間序列分析詳情

    這篇文章主要介紹了python數(shù)據(jù)分析之時(shí)間序列分析詳情,時(shí)間序列分析是基于隨機(jī)過(guò)程理論和數(shù)理統(tǒng)計(jì)學(xué)方法,具體詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-08-08
  • 八大排序算法的Python實(shí)現(xiàn)

    八大排序算法的Python實(shí)現(xiàn)

    這篇文章主要介紹了八大排序算法的Python實(shí)現(xiàn),對(duì)八大排序算法進(jìn)行詳細(xì)描述和代碼實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Python爬蟲(chóng)實(shí)戰(zhàn)之爬取某寶男裝信息

    Python爬蟲(chóng)實(shí)戰(zhàn)之爬取某寶男裝信息

    網(wǎng)絡(luò)爬蟲(chóng)是一種按照一定的規(guī)則自動(dòng)瀏覽、檢索網(wǎng)頁(yè)信息的程序或者腳本。網(wǎng)絡(luò)爬蟲(chóng)能夠自動(dòng)請(qǐng)求網(wǎng)頁(yè),并將所需要的數(shù)據(jù)抓取下來(lái)。本文將為大家介紹如何利用爬蟲(chóng)獲取某寶男裝信息,感興趣的小伙伴可以了解一下
    2021-12-12
  • 什么是python的id函數(shù)

    什么是python的id函數(shù)

    在本篇文章里小編給大家分享了關(guān)于python里id函數(shù)的基礎(chǔ)知識(shí)點(diǎn),需要的朋友們可以一起學(xué)習(xí)下。
    2020-06-06
  • Python如何爬取實(shí)時(shí)變化的WebSocket數(shù)據(jù)的方法

    Python如何爬取實(shí)時(shí)變化的WebSocket數(shù)據(jù)的方法

    這篇文章主要介紹了Python如何爬取實(shí)時(shí)變化的WebSocket數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python正則表達(dá)式函數(shù)match()和search()的區(qū)別

    python正則表達(dá)式函數(shù)match()和search()的區(qū)別

    match()和search()都是python中的正則匹配函數(shù),那這兩個(gè)函數(shù)有何區(qū)別呢?本文詳細(xì)介紹了這2個(gè)函數(shù)的區(qū)別
    2021-10-10
  • 使用pandas讀取csv文件的指定列方法

    使用pandas讀取csv文件的指定列方法

    下面小編就為大家分享一篇使用pandas讀取csv文件的指定列方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 跟老齊學(xué)Python之關(guān)于循環(huán)的小伎倆

    跟老齊學(xué)Python之關(guān)于循環(huán)的小伎倆

    不管是while還是for,所發(fā)起的循環(huán),在python編程中是經(jīng)常被用到的。特別是for,一般認(rèn)為,它要比while快,而且也容易寫(xiě)(是否容易,可能因人而異,但是,執(zhí)行時(shí)間快,是的確的),因此在實(shí)踐中,for用的比較多點(diǎn)。
    2014-10-10

最新評(píng)論

乌什县| 洛浦县| 宁晋县| 五河县| 乌拉特后旗| 苏尼特右旗| 天水市| 吉林省| 苍梧县| 霍山县| 汾阳市| 泽库县| 眉山市| 漯河市| 定西市| 长岭县| 汝南县| 广元市| 海南省| 赣州市| 牡丹江市| 特克斯县| 和龙市| 资源县| 长治县| 隆化县| 河西区| 松滋市| 宣汉县| 靖边县| 耒阳市| 行唐县| 洛宁县| 九台市| 合川市| 古浪县| 揭东县| 仪陇县| 隆尧县| 景洪市| 青海省|