python初始化多维列表的坑

在Python中,使用`*`运算符和`for`循环两种方式初始化m*n的二维列表会得到不同结果。使用`*`运算符时,内层列表实际上只有一个引用,修改一个元素会影响到所有行;而使用`for`循环则创建了独立的内层列表。为避免混淆,推荐使用`for`循环初始化多维列表,确保每个内层列表都是独立对象。
摘要由CSDN通过智能技术生成

问题

我们知道有两种方式可以初始化一个m*n二维列表:

  • 使用*
m, n = 3, 2
x = [[0] * n] * m
  • 使用for
y = [[0] * 2 for i in range(3)]
print(x)
print(y)

乍一看, 两者得到的结果是相同的:

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

实则其中有大坑,我们试着修改下x,y:

x[1][1]=2
y[1][1]=2
print(x)
print(y)

得到如下结果:

[[0, 2], [0, 2], [0, 2]]
[[0, 0], [0, 2], [0, 0]]

坑就在这,方法1得到的多维列表,内层列表其实只有一份拷贝,修改一个就等于修改所有,而方法2内部列表都是独立的个体,修改一个并不会传导到另一个:

x = [[0]*2]*3
y = [[0] * 2 for i in range(3)]
print(*[id(i) for i in x])
print(*[id(i) for i in y])

输出:

2128813329536 2128813329536 2128813329536
2128813351680 2128813351616 2128813351488

结论

为了避免令人迷惑的结果出现, 初始化多维列表时尽量使用:

[[0]*n for i in range(m)]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值