【问题标题】:Python list assignment [duplicate]Python列表分配[重复]
【发布时间】:2014-05-20 00:16:26
【问题描述】:

如何解释?

 s = [1,2,3,4,5,6,7,8,9]
 s[0] = s[0:0]                    #replace s[0] by empty list s[0:0]
 s
 [[], 2, 3, 4, 5, 6, 7, 8, 9]     # s after assignment
 len(s)
 9

 s[3] = s[0:0]                    # samething for s[3]
 [[], 2, 3, [], 5, 6, 7, 8, 9]    # s after s[3] has been replaced by s[0:0]
 len(s)
 9

 s[5:7] = s[0:0]                  # replace a slice by empty list
 s
 [[], 2, 3, [], 5, 8, 9]          # slice has been removed
 len(s)
 7

按照第一部分的逻辑,元素被一个空列表替换并且列表的长度保持不变,我可以预期切片的每个元素都应该被一个空列表替换。

嗯,不是!怎么解释的?

【问题讨论】:

  • “我可以期望切片的每个元素都应该被一个空列表替换”-切片分配不会按元素操作。

标签: python python-2.7 ipython


【解决方案1】:

当您在左侧有一个列表元素时,您可以用右侧的任何内容替换该单个元素。

当您在左侧有一个 slice 时,您将该切片的所有元素替换为右侧列表中的元素。如果右侧没有列表或其他类型的可迭代对象,则分配将失败。由于右侧的列表为空,因此您最终删除了元素。

【讨论】:

    【解决方案2】:

    列表的长度总是守恒的,这不是真的。正确的是左边的切片被右边找到的任何内容替换。

    lst = [0, 1, 2, 3, 4, 5, 6, 7]
    
    print(lst[0]) # prints one value
    print(lst[3]) # prints one value
    print(len(lst[1:3])) # prints 2, length of sublist
    print(len(lst[:])) # prints 4, length of whole list
    
    lst[:] = []  # replace entire list with empty list
    

    顺便说一句,使用切片[0:0] 得到一个零长度列表是很奇怪的。如果代码只是把[](代表零长度列表的文字)放在上面,就更容易理解了。

    【讨论】:

    • 真的!这更像是一个理论问题,而不是实际问题。
    【解决方案3】:
    s[3] = s[0:0]   # replacing single element
    s[5:7] = s[0:0] # replacing two elements and setting to []  removes the elements.
    using s[5] = s[0:0],s[6] = s[0:0] is different from s[5:7]
    

    如果您将s[5:7] = s[0:0] 更改为s[5:7] = s[0:2],您将获得不同的行为,两者都会被更改。

    如果您使用s[5:7] = s[0:1],索引 5 处的元素将被更改,索引 6 处的元素将被删除。

    【讨论】:

    • 嗨帕德莱克!当然,它替换了 2 个元素。但是为什么这两个元素不是空列表呢?
    • 你基本上是将两个元素合二为一。
    • 好的,那一个元素在哪里?
    • @flamenco,你基本上是把两个元素变成 None not one。
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多