>>> a = [1,2,3]
>>> a.pop()
3
>>> a
[1, 2]
>>> a = [1,2,3]
>>> a = a[:-1]
>>> a
[1, 2]
>>>
上述从列表中删除最后一个元素的方法之间是否有区别?
答案 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()
慢。>