013.请说出下面的代码返回结果是什么?
*的坑;简单题
参考: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], [], []]