Разница между list.pop () и list = list [: - 1] - PullRequest
3 голосов
/ 22 июня 2019
>>> a = [1,2,3]
>>> a.pop()
3
>>> a
[1, 2]
>>> a = [1,2,3]
>>> a = a[:-1]
>>> a
[1, 2]
>>>

Есть ли какая-либо разница между вышеупомянутыми методами удаления последнего элемента из списка?

Ответы [ 6 ]

13 голосов
/ 22 июня 2019

Да.pop равно O (1) и изменяет исходный список, а slice равно O (n) и создает копию списка.Менее формально метод pop является операцией над элементом в конце списка и определяется в CPython как вызов list_resize(self, Py_SIZE(self) - 1);.Это не пересекает всю структуру.

С другой стороны, list_slice выделяет новый список и перебирает записи в старом списке в диапазоне от начала до конца -1, копируя ссылки на каждый элемент в новый список.

Если вы пытаетесь удалить последний элемент списка, используйте pop.

2 голосов
/ 22 июня 2019

pop не меняйте идентификатор, просто вставьте один элемент в список.

[:-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]
>>>

вывод идентификатора (номер не важен, то же или не то же самое, что ключевой момент):

4470627464
4470627464
4474450952
1 голос
/ 22 июня 2019

метод pop возвращает последний элемент из списка, который он удаляет. например:

a = [1,2,3,4]
b = a.pop()
print(b)  # 4

Кроме того, используя нарезку, вы создаете копию старого списка, тогда как при использовании pop ссылка на список остается прежней.

0 голосов
/ 22 июня 2019

Существует принципиальная разница, возникающая при использовании в функциях. Использование [:-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()

0 голосов
/ 22 июня 2019

То, как вы их представили, не имеет никакой внешней разницы.Инструкция pop позволяет интерпретатору легче оптимизировать инструкцию, поскольку она может просто уменьшить атрибут длины списка.Присвоение -1 создаст новый список, присвоит его a, а затем оставит старый для сбора мусора.

Существует огромная разница в псевдонимах: если вы назначили что-то еще в этот список, вы получите побочные эффекты с pop.Например:

>>> a = [1, 2, 3, 4]
>>> b = a
>>> b
[1, 2, 3, 4]
>>> a.pop()
4
>>> b
[1, 2, 3]
>>> a = a[:-1]
>>> b
[1, 2, 3]
>>> a
[1, 2]
0 голосов
/ 22 июня 2019

Да, есть разница.когда вы используете 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
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...