[[]]*3 和 [[],[],[]]有区别吗?

2020-06-26  本文已影响0人  大象信步走来

肯定有,没有,我长那么帅干嘛!---- 鸣人鸣言

print([[]]*3)                 # [[],[],[]]
print([[]]*3 == [[],[],[]]) # True

由代码可以看出,二者的值是相等的。但是我们知道值相等并不代表二者等价。下面两段代码比较出了二者的不同。

代码1:

lists1 = [[],[],[]]
print(lists1)        # [[],[],[]]
lists1[0].append(3)
print(lists1)        # [[3],[],[]]

代码2

lists2 = [[]]*3
print(lists2)        # [[],[],[]]
lists2[0].append(3)
print(lists2)        # [[3],[3],[3]]

二者的不同的原因在于:

[[]] 是一个包含了一个空列表的单元素列表,所以 [[]] * 3 结果中的三个元素都是对这一个空列表的引用。 修改 lists 中的任何一个元素实际上都是对这一个空列表的修改。

也就是说:[[]]* 3结果中的三个元素都引用同一个内存地址,这个内存地址上的值(value)变了,大家跟着都变。而[[],[],[]]中的每个元素各自引用一个内存地址,其中一个值给变并不影响另外两个。

print([[]]*3 is [[],[],[]]) # False

提示:is是比较对象的id,而==比较对象的值。

上一篇 下一篇

猜你喜欢

热点阅读