關於python直接用列表名複製的一些問題 以及 python 子串查找

在加載模型中的tensor_name,用到了這部分知識,特此記錄:

舉個例子;

import numpy as np

variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_to_restore:
    print(var)
    if var.find('Adam')>=0:
        variables_to_restore.remove(var)
print(variables_to_restore)

輸出: 

['wc1', 'wc2', 'wc1/Adam_1', 'wc2/Adam', 'wc1/Adam_1', 'wc2/Adam']

 很明顯我們的代碼,是要找到列表中含子串“Adam” 的字符串並刪除,但是,含“Adam”的明顯沒有被完全刪除,因此筆者開始分析原因,因爲variables_to_restore是動態變化的,所以遍歷自然不同,因此筆者猜想,如果遇到刪除的項則刪除,且會跳過下一項,遍歷下下一項。筆者爲了驗證自己的想法,特此重新打亂順序做了實驗:

import numpy as np

variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_to_restore:
    print(var)
    if var.find('Adam_1')>=0:
        variables_to_restore.remove(var)
print(variables_to_restore)

結果:

['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']

['wc1', 'wc2', 'wc1/Adam', 'wc2/Adam_1', 'wc2/Adam', 'wc1/Adam', 'wc2/Adam_1', 'wc2/Adam']

這驗證了筆者的猜想。

那麼爲了完全刪除應該怎麼辦呢?有的同學會想,好,那我重新聲明一個list不就好了,於是開始這樣做:

import numpy as np

variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_to_restore:
    print(var)
    if var.find('Adam')>=0:
        variables_to_restore.remove(var)
print(variables_to_restore)

 結果:

['wc1', 'wc2', 'wc1/Adam_1', 'wc2/Adam', 'wc1/Adam_1', 'wc2/Adam']

 就驚呆了,明明重新定義了一個list爲什麼還是不行,其實這就跟python的機制有關係了,直接通過名字來賦值,相當於兩個命名指向同一塊內存區域,操作的時候雖然名字不同,但是是同一數據!!

正確做法:

import numpy as np

variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
variables_map = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']

for var in variables_map:
    print(var)
    if var.find('Adam')>=0:
        variables_to_restore.remove(var)
print(variables_to_restore)

結果:

['wc1', 'wc2']

正確的做法是重新將數據賦值給一個新變量,開闢新的內存區域。 

 

PS:python 子串查找

str.find() #未找到返回-1,找到返回索引>=0

list_site.remove(var) #從列表中刪除某個值

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章