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