a = [[] for i in range(3)] 和 b = [[]] *3 一样吗

python中关于列表内容复制

首先,给第一个常用例子:

>>>a = [[] for i in range(3)]   #嵌套生成2维空列表
>>>a
[[], [], []]

接下来,给第二个例子

>>>b = [[]] *3
>>>b
[[], [], []]

这样看起来a和b没有区别,a==b?? 我们来看一下a中和b中每个空列表的地址:

>>>for i in range(3):
           print('a[{}]的地址:\t{}'.format(i,id(a[i])))   # python中查看对象的地址,用id()
a[0]的地址:        2316168122632
a[1]的地址:        2316168125128
a[2]的地址:        2316168081160
>>>for i in range(3):
           print('b[{}]的地址:\t{}'.format(i,id(b[i])))   # python中查看对象的地址,用id()
b[0]的地址:        2316168081224
b[1]的地址:        2316168081224
b[2]的地址:        2316168081224

可以看到a[0], a[1], a[2]的地址是不一样的呢,但是b[0], b[1], b[2]的地址是一样的,那么地址一样或不一样又如何呢?下面看一个真实应用场景
我们要对a,b中的空列表添加内容

>>>a[0].append(1)
>>>a
[[1], [], []]       #输出正常,符合预期
>>>b[0].append(1)
>>>b
[[1], [1], [1]]       #Oh, god, 我们明明只给b[0]添加了为什么b[1], b[2]也会有内容,而且跟b[0]
                      -->因为b在创建时,`b[0], b[1], b[2]`地址一样

其他的对象类比是一样的,比如:

[{} for _ in range(3)] = [{}, {}, {}]               [{} for _ in range(3)]  !=  [{}]*3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值