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

Radinka ·
更新时间:2024-11-13
· 766 次阅读

目录

使用[[v]*n]*n遇到的坑

遇到的问题

通过一番研究

使用[[v]*n]*m遇到的问题

需求:想通过python生成m行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]]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



在python中 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号