Не понимаю, Python pop изменяет несколько переменных - PullRequest
2 голосов
/ 17 декабря 2010

Я уверен, что это что-то простое, что я упустил, но я надеюсь, что кто-то может объяснить мне следующее:

origList = [1, 2, 3, 4, 5, 6, 7, 8]
def test(inputList):
    while range(len(inputList)):
        inputList.pop()
altList = origList
test(altList)
print 'origList:', origList # prints origList: []
print 'altList:', altList # prints origList: []

Мне показалось, что я понял list.pop (), ночто я не понимаю, так это то, почему исходный список изменяется, если я только «выталкиваю» элементы альтернативного списка ...

Ответы [ 4 ]

7 голосов
/ 17 декабря 2010

Все в Python является ссылкой.Это один и тот же список.

altList = origList[:]
3 голосов
/ 17 декабря 2010

Это потому, что строка:

altList = origList

не создает копию объекта origList.Оба имени будут ссылаться на один и тот же базовый объект.Чтобы создать копию, см. модуль копирования .

2 голосов
/ 17 декабря 2010

это потому, что когда вы говорите

altList = origList

вы фактически указываете местоположение altList на местоположение origList (поскольку все в python является объектом). фактически равенство здесь означает «сделать их одним и тем же объектом», а не давать им одинаковые значения.

1 голос
/ 17 декабря 2010

«Проблема» в этой строке:

altList = origList

В Python присвоение списка, подобного этому, выполняет только "мелкую копию"; altList просто становится еще одной ссылкой на данные в origList, а не является совершенно новой копией.

Чтобы получить то, что вы хотите, попробуйте

from copy import deepcopy

altList = deepcopy(origList)
...