python中用“*”运算符复制列表时子列表实际上引用的是同一个列表,列表和嵌套列表的坑

先看一个例子,我想改变load的子列表中第五个元素,从0.8-1.2分布。

load = [[0, 1, 2, 3, 4, 0, 6]] * 10

# 设置起始值和步长
start = 0.8
der = 0
# 更新每个嵌套列表中的第六个元素
for i in range(10):
    load[i][5] = start + der
    der += 0.4 / 10

print(load)

输出如下,可以看到每个子列表中的第5个元素相同,并没有实现从0.8-1.2分布。

[[0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6], [0, 1, 2, 3, 4, 1.1600000000000001, 6]]

问题在这儿:

当你使用 load = [[0, 1, 2, 3, 4, 0, 6]] * 10 的时候,Python实际上复制的是外部列表的引用,而不是内部数组本身。因此,所有的子列表实际上引用的是同一个列表。

当你修改了一个子列表的元素时,所有的子列表都会随之改变。因为他们实际上都是同一个子列表的引用。

如果想要实现上述功能,改成这样即可:

load = [[0, 1, 2, 3, 4, 0, 6] for _ in range(10)]

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值