首先我們看如下**:
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 安...