Python 3 list.pop () против среза - PullRequest
0 голосов
/ 11 июля 2019

Учитывая, что:

l = [1,2,3,4,5]

В чем разница между l.pop(0) и l = l[1:], если мы рассматриваем только окончательное состояние l?

Мне кажется, что содержимое l должно быть одинаковым, независимо от того, какой вариант я выбрал, и простые тесты, кажется, показывают то же самое, но у меня есть фрагмент кода, который ведет себя по-разному в зависимости от того, какую операцию я использую.

Я использую Python 3.6.7 от Anaconda.

РЕДАКТИРОВАТЬ: Пример кода:

forward = range(10)
backward = forward[::-1]

parts = []
f_p = []
b_p = []
for f, b in zip(forward, backward):
    if len(f_p) == 3:
        parts.append((f_p, b_p))
        f_p = f_p[1:] # f_p.pop(0)
        b_p = b_p[1:] # b_p.pop(0)
    f_p.append(f)
    b_p.append(b)
print(parts)

Почему результаты отличаются?

P.S. Мне известно, что pop() возвращает элемент, но в данный момент меня интересует только сам список.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Основным отличием является то, что один вызов по значению, а другой вызов по ссылке. pop влияет на исходный список, а нарезка - до тех пор, пока вы явно не дойдете до

def test_pop(ls):
    return ls.pop(0)
def test_slice(ls):
    return ls[1:]

l = [1,2,3,4,5]

print(l) #[1, 2, 3, 4, 5]
test_slice(l)
print(l) #[1, 2, 3, 4, 5] doesn't effect the original list
test_pop(l)
print(l) #[2, 3, 4, 5] effects the original list
0 голосов
/ 11 июля 2019

Если вы просто попытаетесь напечатать результаты, вы увидите результаты:

l = [1,2,3,4,5]
print (l.pop(0)) # 1: The method returns the removed item
print (l) # [2, 3, 4, 5] # list after removing item
l = [1,2,3,4,5]
print (l[1:]) # [2, 3, 4, 5] # new list with starting integer where the slicing of the object starts

l.pop(0): метод pop () удаляет элемент по указанному индексу из списка. Метод также возвращает удаленный элемент, в вашем случае возвращает 1, как вы можете увидеть, печатаете ли вы список заново с помощью pop (), в вашем списке больше нет элемента thet

l[1:]: Конструктор slice () создает объект слайса, представляющий набор индексов, заданных диапазоном (start, stop, step), в вашем случае вы получили новый список с начальным целым числом, с которого начинается срезание объекта

...