關於轉殖列表的問題

2021-09-25 09:27:23 字數 1223 閱讀 2416

首先我們看如下**:

def removedups(l1,l2):

'''假設l1,l2是列表,

刪除l2**現的l1中的元素'''

for e1 in l1:

if e1 in l2:

l1.remove(e1)

l1 = [1,2,3,4]

l2 = [1,2,5,6]

removedups(l1,l2)

print('l1=', l1)

這段**預期執行結果是 l1 = [3,4],但是實際執行結果是l1 = [2,3,4]。因為實際在for迴圈中,python會內建計數器count跟蹤程式在列表中的位置,count每次迭代結束會加一,當計數器的值等於列表當前長度,迴圈中止。在本例中,程式首先count = 0,發現l1[0]在l2中,於是刪除l1[0],count加一,**會繼續檢查l1[1]是否在l2中。但是此時l1已經變為[2,3,4],所以l1[1]是3而不是2,所以就不會刪除,因此結果就會像上述說的那樣。

首先明白列表儲存的是什麼,列表儲存的是物件的引用。這個時候要想實現功能就得把l1元素拷貝下來,也就是轉殖。用切片操作進行淺拷貝(後續會進一步說明什麼是淺拷貝,深拷貝),把for迴圈改為for e1 in l1[:] :即可。

在python中不僅僅只有切片可以轉殖列表,內建模組copy也可以轉殖

具體實現:

import copy #內建模組

def removedups(l1,l2):

'''假設l1,l2是列表,

刪除l2**現的l1中的元素'''

l3 = copy.deepcopy(l1) #拷貝l1中元素

for e1 in l3:

if e1 in l2:

l1.remove(e1)

'''此時遍歷的就是l3列表,再從l3中找出和l2相同元素,對l1中元素進行刪除操作。由於l3長度不會變,內建計數器count自增,要刪除的元素就會按照預期一樣刪除了,返回的l1結果集就正確。

用切片轉殖的思維類似'''

l1 = [1,2,3,4]

l2 = [1,2,5,6]

removedups(l1,l2)

print('l1=', l1)

這些是我對轉殖的淺淺的理解,具體不懂可以在圖上畫畫操作一下。

類的轉殖問題

object中有預設protected的clone 方法,此方法預設丟擲異常 protected native object clone throws clonenotsupportedexception 因為每個類直接或間接的父類都是object,因此它們都含有clone 方法,但是因為該方法是p...

關於vmware虛擬機器轉殖的網路問題

關於vmware虛擬機器轉殖的網路問題 虛擬機器轉殖完後,輸入ifconfig命令,會發現沒有網路配置檔案。實際上並不是沒有,而是因為乙個虛擬機器linux系統有兩個網路配置檔案,輸入ifconfig a即可看到。為什麼會有兩個網路配置呢。原因分析 我們安裝完乙個全新的linux後,會發現 etc ...

關於phpwind轉殖使用者的方法

作grnfbyh者 lcx vbs小鋪 首先將字符集中的174轉一下,wscript.echo cstr hex ascb chrb 174 url編碼的結果為 ae。當然你www.cppcns.com用別的字符集裡 1的也可以,我用的是174。然後用achwww.cppcns.comilles 安...