錯誤代碼:
import copy lists={} test=['s1','s2','s3'] data = {'value': '',} for i in range(2): lists[i] = data for j in range(2): lists[j]['value']=test[j] print(lists)
結果:
Connected to pydev debugger (build 182.5107.22) {0: {'value': 's2'}, 1: {'value': 's2'}}
改正后代碼
import copy lists={} test=['s1','s2','s3'] data = {'value': '',} for i in range(2): lists[i] = copy.deepcopy(data) for j in range(2): lists[j]['value']=test[j] print(lists)
結果:
Connected to pydev debugger (build 182.5107.22) {0: {'value': 's1'}, 1: {'value': 's2'}}
原因:
lists[i] = data 在執行 賦值時, 每一次調用的都是 data變量的源地址,並沒有改變地址。
所以我們在下面動態的改變值的時候,就會出現改變一個值,所有結果全部改變。
類似於python的淺拷貝和深拷貝。 所以只需要將其變為深拷貝即可。copy.deepcopy().
補充:
# 這個是嵌套列表 也會出現相同問題
import copy lists=[] test=['s1','s2','s3'] data = [1] for i in range(2): lists.append(data) lists[0].append('1') print(lists)
結果:
[[1, '1'], [1, '1']]
改正:
import copy lists=[] test=['s1','s2','s3'] data = [1] for i in range(2): lists.append(copy.deepcopy(data)) lists[0].append('1') print(lists)
結果:
[[1, '1'], [1]]