почему оператор присваивания в цикле выполняется только один раз в Python - PullRequest
1 голос
/ 07 апреля 2019

Я думаю, что это отличается от привычек языка Си в моем.Я хочу извинять оператор присваивания каждый раз, так как это сделать?

input

a = [0,1,2,3,4,5]
for i in range(6):
    b = a
    print(len(b))
    c = b.pop(i)

output

6
5
4
3
Exception has occurred: IndexError
pop index out of range

Кажется, что b = a только один раз оправдать.

ответ, который я хочу получить:

6
6
6
6
6
6

Я не хочу менять b длину.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Во-первых, вы не используете numpy, поэтому нет необходимости импортировать его.

Во-вторых, то, что вы называете «назначением», на самом деле не существует в Python. Скорее, вы привязываете name b к значению, к которому также привязан a. С практической точки зрения, нет разницы между вашим кодом и этим:

a = [0,1,2,3,4,5]
for i in range(6):
    print(len(a))
    c = a.pop(i)

Если вам нужна копия, вам нужно явно ее создать:

a = [0,1,2,3,4,5]
for i in range(6):
    b = a[:]  # or b = a.copy()
    print(len(b))
    c = b.pop(i)

Выход:

6
6
6
6
6
6
1 голос
/ 07 апреля 2019

a и b - это не разные объекты, это просто разные имена для одного и того же объекта.Когда вы говорите b.pop(i), вы изменяете один объект, на который указывают и a, и b, поэтому выполнение b=a ничего не делает после первой итерации;b уже указывает на тот же объект, что и a.То, что вы хотите сделать, можно сделать, выполнив b=a.copy().

...