在python中使用[[v]*n]*n遇到的坑及解決
使用[[v]*n]*n遇到的坑
今天通過[[v]*n]*n快速創建列表, 當我使用索引修改值時, 本來是打算修改a[0][0]這一個元素的第一個值, 但是打印結果卻將三個元素第一值都修改瞭,所以就記錄一下!
遇到的問題
>> data = [[0] *3] *3 >> data [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >> data[0][0] = 1 >> data [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
通過一番研究
>> id(data[0]) 836879108296 >> id(data[1]) 836879108296 >> id(data[2]) # 可以發現,三個元素使用的是同一個內存地址編號 836879108296 # 推薦使用這種方法或者使用列表推導式 >> data2 = [[1,2,3],[4,5,6],[7,8,9]] >> id(data2[0]) 836879107208 >> id(data2[1]) 836879108552 >> id(data2[2]) 836879109960 # 使用列表推導式 >> data3 = [[1,2] for i in range(10)] >> data3[0][0] = 100 [[100, 2], # 隻是修改瞭第一個元素的第一個值 [1, 2], ... [1, 2]] # 查看內存地址 >> id(data3[0]) 836879107528 >> id(data3[1]) 836848339912
使用[[v]*n]*m遇到的問題
需求:想通過python生成m行n列的矩陣
方式1:(有問題)
data = [[0]*3]*4 #4行3列 data
輸出
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
修改data[0][0]元素的值
data[0][0] = 1 data
輸出
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
哇,是不是對結果很迷,為啥改變一個值會對列為0的所有元素改變呢?
解析:我們可以看下他們對應的內存指向地址
問題出在這裡瞭。
方式2:
#輸入 data1 = [[0 for i in range(3)] for j in range(4)] data1 # 輸出 [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] #輸入 data1[0][0] = 1 data1 #輸出 [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持LevelAH。
推薦閱讀:
- Python中range函數的基本用法完全解讀
- Python 如何讓特征值滯後一行
- Python實現 MK檢驗示例代碼
- 學會迭代器設計模式,幫你大幅提升python性能
- 利用Python制作一個簡單的天氣播報系統