*的坑;简单题
参考:https://docs.python.org/zh-cn/3.9/library/stdtypes.html#typesseq
lists = [[]] * 3
lists[0].append(1)
请问lists此时是什么?
如果刚学python你应该会脱口而出[[1],[],[]]
但如果学过一段时间了,老师这么问,应该有猫腻,难道是?
所以答案是
[[1],[1],[1]]
[[1],[],[]]
看下面的演示代码你就知道为何是上面的结果了
>>> list1 = [[]]
>>> id(list1[0])
2096763202240
>>> list1*3
[[], [], []]
>>> list1
[[]]
>>> list2 = list1*3
>>> list2
[[], [], []]
>>> id(list2[0])
2096763202240
>>> id(list2[1])
2096763202240
>>> id(list2[2])
2096763202240
从上面的演示代码可以看出
list1是一个含有一个空列表的列表,list1*3这样的行为中的三个元素都是对那个空列表的引用,都是同一个对象!
修改 lists1
中的任何一个元素实际上都是对这一个空列表的修改
事实只要是可变对象都是如此的效果
>>> list4 =[{}] * 4
>>> list4
[{}, {}, {}, {}]
>>> list4[0]['name']='wuxianfeng'
>>> list4
[{'name': 'wuxianfeng'}, {'name': 'wuxianfeng'}, {'name': 'wuxianfeng'}, {'name': 'wuxianfeng'}]
如果你要创建一个包含多个同款可变对象的列表
正确的姿势可以是这样的
>>> list2 = [[] for _ in range(3)]
>>> list2[0].append(1)
>>> list2
[[1], [], []]