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], [], []]