我有一個矩陣(二維串列),在整個范圍內填充了字典型別的變數,其中包含"val": False
問題是當我只想更改矩陣中的一項并將該特定項的值更改為 True 時。
這部分代碼以某種方式:matrix[3][2]["val"] = True導致整個矩陣更新“val”值并將所有 False 值更改為 True。
這是我的代碼:
defval = {
"val": False
}
matrix = []
for x in range(5):
row = []
for i in range(5):
row.append(defval)
matrix.append(row)
matrix[3][2]["val"] = True
uj5u.com熱心網友回復:
這種行為的出現是由于 python 中的變數是通過參考而不是值傳遞的。例如:
some_dict = {'foo': 'bar'}
other_dict = some_dict # actually references the same object as some_dict
other_dict['foo'] = 'buzz' # update applies to the dictionary object being referenced
print(other_dict) # {'foo': 'buzz'}
print(some_dict) # {'foo': 'buzz'}
因此,矩陣中的所有元素實際上都參考同一個字典物件,并且在更新時,更改會反映在所有參考中。為避免這種情況,您可以使用字典的復制方法,該方法回傳字典的淺表副本。因此,您的代碼可能如下所示:
defval = {
"val": False
}
matrix = []
for x in range(5):
row = []
for i in range(5):
row.append(defval.copy())
matrix.append(row)
matrix[3][2]["val"] = True
uj5u.com熱心網友回復:
使用時row.append(defval),python不會復制存盤在中的dict defval,而是會在陣列中存盤對dict的參考。因此,所有行都隱含地使用相同的陣列。當您修改條目時,所有行都會被修改,因為它們都參考同一個字典。
下面的代碼給出了一個類似的例子:
blah = [1]
some_list = [blah, blah]
some_list[0][0] = 2
print(some_list)
# [[2], [2]]
print(blah)
# [2]
blah_1 = [1]
blah_2 = [1]
some_list_2 = [blah_1 , blah_2]
some_list_2[0][0] = 2
print(some_list_2)
# [[2], [1]]
print(blah_1)
# [2]
print(blah_2)
# [1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/534253.html
標籤:Python列表字典
