Как происходит удаление элемента из списка в Python?

Есть вот такой кусок кода

import random

A = float(input("Введите А: "))
B = float(input("Введите В: "))
List = []
List2 = []

for i in range(0, 31):
    List.append(random.randint(A, B))


List2 = List
List2.pop(0)


print(List)

print(List2)

При выполнении получаю примерно следующее:

Введите А: 10
Введите В: 20
[13, 12, 10, 16, 13, 20, 11, 11, 11, 12, 10, 12, 15, 13, 18, 18, 13, 14, 12, 13, 20, 15, 16, 19, 12, 10, 18, 14, 18, 20]
[13, 12, 10, 16, 13, 20, 11, 11, 11, 12, 10, 12, 15, 13, 18, 18, 13, 14, 12, 13, 20, 15, 16, 19, 12, 10, 18, 14, 18, 20]

То есть элемент из списка не удаляется. Но если написать вот так:

import random

A = float(input("Введите А: "))
B = float(input("Введите В: "))
List = []
List2 = []

for i in range(0, 31):
    List.append(random.randint(A, B))


print(List)

List2 = List
List2.pop(0)

print(List2)

то результат получается такой, какой и ожидается:

Введите А: 10
Введите В: 20
[18, 15, 15, 12, 19, 17, 13, 19, 16, 15, 18, 17, 10, 19, 17, 15, 15, 14, 10, 15, 17, 10, 14, 17, 20, 11, 12, 11, 12, 19, 20]
[15, 15, 12, 19, 17, 13, 19, 16, 15, 18, 17, 10, 19, 17, 15, 15, 14, 10, 15, 17, 10, 14, 17, 20, 11, 12, 11, 12, 19, 20]

Почему это отрабатывает так?


Ответы (2 шт):

Автор решения: ПИТОНИСТ версия-3-8

Новый код:

import random

A = float(input("Введите А: "))
B = float(input("Введите В: "))
List = []
List2 = []

for i in range(31):
    List.append(random.randint(A, B))


List2 = List[:]
List2.pop(0)


print(List)

print(List2)

Разберём ваши ошибки.

Во-первых, с помощью List2=List вы ссылаетесь на список List, и при изменении List2 у вас изменяется и List тоже. То есть, вы неверно написали:

То есть элемент из списка не удаляется.

Элемент удаляется, но удаляется из двух списков. Соответственно, во втором случае если вы замените кусок кода:

print(List)

List2 = List
List2.pop(0)

print(List2)

на следующий

print(List) #одно значение

List2 = List
List2.pop(0)
print(List) #совершенно другое значение
print(List2)

, то список List выведется двумя разными значениями.

Чтобы решить проблему, замените List2=List на List2=List[:] (как я уже сделал в готовом коде)

Во-вторых, зачем делать for i in range(0, 31), если можно сделать for i in range(31)?

→ Ссылка
Автор решения: dtroyan

Потому что вы создаете не новую переменную, как это делается в других языках, а создаете новую ссылку на уже созданный объект.

Чтобы создать новый объект делается так:

import copy
List2 = copy.deepcopy(List)
→ Ссылка