list.pop()和list = list [:-1]之间的区别

时间:2019-06-22 00:04:38

标签: python list

>>> a = [1,2,3]
>>> a.pop()
3
>>> a
[1, 2]
>>> a = [1,2,3]
>>> a = a[:-1]
>>> a
[1, 2]
>>>

上述从列​​表中删除最后一个元素的方法之间是否有区别?

6 个答案:

答案 0 :(得分:13)

是的。 pop为O(1)并改变原始列表,而slice为O(n)并创建列表的副本。非正式地,pop方法是对列表末尾元素的操作,并在CPython中定义为对list_resize(self, Py_SIZE(self) - 1);的调用。这不会遍历整个结构。

另一方面,list_slice分配一个新列表,并循环遍历旧列表中的条目,从头到尾-1,将对每个项目的引用复制到新列表中。

如果您要删除列表的最后一个元素,请使用pop

答案 1 :(得分:2)

pop不会更改ID,只需弹出列表中的一项即可。

[:-1]是切片操作,可从旧列表创建新列表。

>>> a = [1,2,3]
print(id(a))
>>> a.pop()
3
print(id(a))
>>> a
[1, 2]
>>> a = [1,2,3]
>>> a = a[:-1]
>>> a
print(id(a))
[1, 2]
>>>

id输出(数字不重要,相同或不相同是关键点):

4470627464
4470627464
4474450952

答案 2 :(得分:1)

pop 方法返回其删除列表中的最后一项。 例如:

right

此外,使用切片,您正在复制旧列表,而使用 pop ,列表引用保持不变。

答案 3 :(得分:0)

是的,有区别。 当您使用a.pop()时,您也会从列表中删除 当您使用[:-1]对象列表时,不会更改 检查len(a)

>>> a = [1,2,3]
>>> a
[1, 2, 3]
>>> a[:-1]
[1, 2]
>>> len(a[:-1])
2
>>> a.pop()
3
>>> a
[1, 2]
>>> len(a)
2
>>> 

答案 4 :(得分:0)

您呈现它们的方式没有外在差异。 const double& SkewSymmetricMatrix::operator()( int j, int k ) const { assert( j >= 0 && j < size() ); assert( k >= 0 && k < size() ); if( j < k ) { const mirror* coeff = getCoeff(); return coeff[ j * ( j - 1 ) / 2 + k ].left; } else if ( j > k ) { const mirror* coeff = getCoeff(); return coeff[ k * ( k - 1 ) / 2 + j ].right; } else { return const_zero; } } 指令使解释器更容易优化指令,因为它只能减少列表的长度属性。 a = [1,2,3,4] b = a.pop() print(b) # 4 分配将构造一个新列表,将其分配给pop,然后将旧列表留给垃圾回收。

别名之间存在巨大差异:如果为该列表分配了其他名称,则-1会产生副作用。例如:

a

答案 5 :(得分:0)

使用in函数存在一个基本的区别。使用[:-1]不会改变原始列表,但是pop()可以。

a = [1,2,3]
b = [1,2,3]


def functionb(list):
    list = list[:-1]
    return list
def withpop(list):
    return list.pop()

functionb(b)
withpop(a)
print b
print a

将打印:

[1, 2, 3]
[1, 2]

第二个是执行时间。 pop()[:-1]快,因为使用[:-1]时必须覆盖列表。假设您索引中有数千个值,因此它比pop()慢。