Python 生成指定维度的list,而且不会发生一改全改,浅复制,和深复制 的区别

正确范例如下

str2_list_len=5
str1_list_len=10
l=list()
Array=list()
for i in range(str1_list_len + 1):
    l=list()
    for i in range(str2_list_len + 1):
        l.append([0, 0])
    Array.append(l)
Array[0][0][0]=1;
print(Array)

[[[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]]
 

错误范例1:

str2_list_len=5
str1_list_len=10
l=list()
Array=list()
for i in range(str2_list_len + 1):
    l.append([0, 0])
for i in range(str1_list_len + 1):
    Array.append(l.copy())
Array[0][0][0]=1;
print(Array)

[[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]]

修改:

import copy
str2_list_len=5
str1_list_len=10
l=list()
Array=list()
for i in range(str2_list_len + 1):
    l.append([0, 0]) #在这里【0,0】 就是新生成的。所以之间没有关系
for i in range(str1_list_len + 1):
    Array.append(copy.deepcopy(l)) 
Array[0][0][0]=1;
print(Array)

#之前的 ".copy()"是浅复制,只能对第一维产生新的存储空间,不能为第二维产生新的存储空 间,所以改变一个全变。改为深复制后,可以对高维产生存储空间。不会发生一改全改。

错误范例2 :
str2_list_len=5
str1_list_len=10
l=list()
Array=list()
l=[[0,0]]*str2_list_len
Array=[l]*str1_list_len
Array[0][0][0]=1;
print(Array) 


[[[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]], [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0]]]

#分析所有的【0,0】,都保存在一个地址上:只要改其中一个,所有【0,0】全都该。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值