日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

在python中使用[[v]*n]*n遇到的坑及解決_python

作者:范翻番樊 ? 更新時間: 2022-07-07 編程語言

使用[[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]]

原文鏈接:https://blog.csdn.net/u011361138/article/details/80138226

欄目分類
最近更新