【问题标题】:Whats the difference between list[-1:][0] and list[len(list)-1]?list[-1:][0] 和 list[len(list)-1] 有什么区别?
【发布时间】:2010-10-15 10:22:15
【问题描述】:

免得说你想要一个python列表的最后一个元素:有什么区别

myList[-1:][0]

myList[len(myList)-1]

我认为没有区别,但后来我尝试了这个

>>> list = [0]
>>> list[-1:][0]
0
>>> list[-1:][0] += 1
>>> list
[0]
>>> list[len(list)-1] += 1
>>> list
[1]

我有点惊讶……

【问题讨论】:

  • 不知道为什么要写list[-1:][0];通常的写法就是list[-1]。此外,您可能希望通过将列表命名为 list 来避免隐藏内置 list()

标签: python list slice


【解决方案1】:

如果您使用切片 [-1:],则返回的列表是浅拷贝,而不是引用。所以 [-1:][0] 修改了新列表。 [len(list)-1] 是对最后一个对象的引用。

【讨论】:

    【解决方案2】:

    list[-1:] 创建一个新列表。要获得与list[len(list)-1] 相同的行为,它必须返回某种list 的视图,但正如我所说,它会创建一个新的临时列表。然后继续编辑临时列表。

    不管怎样,你知道你可以用list[-1]做同样的事情,对吧?

    【讨论】:

      【解决方案3】:

      切片创建副本(浅副本)。它通常用作浅拷贝习语。

      list2 = list1[:]
      

      等价于

      import copy
      list2 = copy.copy(list1)
      

      【讨论】:

      • 这似乎比使用副本更不可读/可理解......有没有理由“经常使用”?
      • 我同意它的可读性较差。为什么使用它?我猜,那是因为它不需要导入。
      • 您认为他们避免导入是因为它需要另一行代码,还是因为他们试图避免某种开销(内存、加载时间等)?跨度>
      • 好吧,例如 list1[:] 是一个表达式。 copy.copy(list1) 也是表达式。但导入副本; copy.copy(list1) 不是。
      • 顺便说一句。它在文档中得到认可。 docs.python.org/library/copy.html "字典的浅拷贝可以使用 dict.copy() 制作,列表的浅拷贝可以通过分配整个列表的切片,例如,copyed_list = original_list[:]"
      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2012-09-26
      • 2021-12-21
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多