【问题标题】:What's the difference between a[] and a[:] when assigning values?赋值时 a[] 和 a[:] 有什么区别?
【发布时间】:2013-03-04 12:46:33
【问题描述】:

我碰巧看到了这个sn-p的代码:

a = []  
a = [a, a, None]
# makes a = [ [], [], None] when print

a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print

似乎a[:] 赋值分配了一个指针,但我找不到关于它的文档。所以谁能给我一个明确的解释?

【问题讨论】:

    标签: python variable-assignment slice


    【解决方案1】:

    在 Python 中,a 是一个名称 - 它指向一个对象,在本例中是一个列表。

    在您的第一个示例中,a 最初指向空列表,然后指向新列表。

    在您的第二个示例中,a 指向一个空列表,然后 更新 以包含新列表中的值。这不会更改a 引用列表。

    最终结果的不同之处在于,由于首先计算操作的右侧,因此在这两种情况下,a 都指向原始列表。这意味着在第一种情况下,它指向曾经是a的列表,而在第二种情况下,它指向自己,形成一个递归结构。

    如果您无法理解这一点,我建议您查看it visualized

    【讨论】:

    • 网教第3步显示a中的第二个空列表其实是指向第一个的指针。你能解释一下吗?
    • @can。它们都是同一个列表。当您将a 两次放入列表中时,会从该列表中引用同一对象两次。如果您希望它成为具有相同元素的新列表,则需要复制该列表。
    • 那么在这种情况下如何进行复制呢?
    • @can。 copy.copy()(或 copy.deepcopy(),如果您有嵌套数据结构)。
    • @pythonm 如果您不打算使用copy.copy(),我会推荐new_l = list(old_l) 作为比列表切片更具可读性的替代方案。
    【解决方案2】:

    第一个将a指向一个新对象,第二个将改变a,所以a引用的列表还是一样的。

    例如:

    a = [1, 2, 3]
    b = a
    print b # [1, 2, 3]
    
    a[:] = [3, 2, 1]
    print b # [3, 2, 1]
    a = [1, 2, 3]
    #b still references to the old list
    print b # [3, 2, 1]
    

    【讨论】:

      【解决方案3】:

      @pythonm 响应中的更清晰示例

      >>> a=[1,2,3,4]
      >>> b=a
      >>> c=a[:]
      >>> a.pop()
      4
      >>> a
      [1, 2, 3]
      >>> b
      [1, 2, 3]
      >>> c
      [1, 2, 3, 4]
      >>> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2019-01-12
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多