有些時候我們在for循環中想把某一個list或者dict賦值給一些元素,比如下面這種場景:
我們想得到的是lst2的值是
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
但是結果是
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
lst1 = []
lst2 = []
for i in range(5):
lst1.append(i)
lst2.append(lst1)
for j in lst2:
print(j)
這是因爲我們一直在將同一個lst1賦值給lst2的元素,並且一直在清空lst1。有以下處理方法:
①深拷貝
有深拷貝就有淺拷貝,淺顯地說淺拷貝就是不管怎麼變化都是指向同一個尋址地址,所以原對象和拷貝對象只要一者有變動,都會聯動變化,也就是上面lst2的內容都變成[0,1,2,3,4]的意思。而深拷貝則是複製出一個不相關的對象,原對象和拷貝出來的對象變化不相關。
import copy
lst1 = []
lst2 = []
for i in range(5):
lst1.append(i)
lst2.append(copy.deepcopy(lst1))
for j in lst2:
print(j)
②字符串固定
lst1 = []
lst2 = []
for i in range(5):
lst1.append(i)
lst2.append(str(lst1))
for j in lst2:
print(j)
上述代碼能夠得到和深拷貝一樣的結果。