创建数组—[[0]*n]*m与[[0 for _ in range(n)] for _ in range(m)]的区别


需求:想通过python生成m行n列的矩阵

方式1:(有问题)

data = [[0]*3]*4   #4行3列
print(data) #[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

赋值

data[0][0] = 1
print(data) #[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]

为啥改变一个值会对列为0的所有元素改变呢?

解析:看下对应的内存指向地址

print(id(data[0][0]),id(data[1][0])) #1980216384 1980216384
print(id(data[0][1]),id(data[1][1])) #1980216352 1980216352

[[0]n]m这种方式是直接将[0]n 复制了m遍,是=号复制(注意不是浅拷贝,=与浅拷贝的list id是不同的),若[0]n发生了更改,则m个都发生更改


方式2:

data1 = [[0 for i in range(3)] for j in range(4)]
print(data)#[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

赋值

data[0][0] = 1
print(data) #[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM