>>> def duplicate(l):
... l = l + l
...
>>> l1 = [1, 2, 3]
>>> duplicate(l1)
>>> l1
[1, 2, 3]
Я считаю, что функция выше дублирует список. Но почему результат не [1, 2, 3, 1, 2, 3]
?Списки и функции Аргументы
>>> def duplicate(l):
... l = l + l
...
>>> l1 = [1, 2, 3]
>>> duplicate(l1)
>>> l1
[1, 2, 3]
Я считаю, что функция выше дублирует список. Но почему результат не [1, 2, 3, 1, 2, 3]
?Списки и функции Аргументы
Конкатенация двух объектов списка (как и с l + l
) всегда создает объект новый объект списка. В вашей функции вы затем назначаете этот новый объект списка обратно локальной переменнойl
, которая не зависит от глобальной ссылки l1
. Исходный объект списка не затронут, потому что было скопировано только содержимое списка.
Если вы хотите, чтобы изменить список объектов на месте, вам необходимо расширить l
с собой:
def duplicate(l):
l.extend(l)
list.extend()
копирует все элементы из списка, вы проходите в и добавляет их к концу объекта списка вы вызвали его. Прохождение в самом списке безопасно; он копирует только исходные элементы.
Демо:
>>> def duplicate(l):
... l.extend(l)
...
>>> l1 = [1, 2, 3]
>>> duplicate(l1)
>>> l1
[1, 2, 3, 1, 2, 3]
Спасибо! Меня смущает «l + l создает новый объект списка». Когда мы будем называть duplicate (l1), тогда будет выполняться тело функции (l1 = l1 + l1) и почему l1 - это новый объект списка? –
Поскольку '+' конкатенация в объекте списка всегда создает новый экземпляр списка. –
Ничего себе это действительно 412K repu?!. Я вдохновлен .... – repzero
из-Scope? – Gogo
@StevieG: нет, то же самое произойдет и вне функции: 'l = l1 + l1' все равно оставит' l1' неизменным. –
Как в стороне, используя один строчный регистр L (l), просто нужно беспокоиться о путанице с одним (1) – Foon