2015-11-10 4 views
1
>>> def duplicate(l): 
...  l = l + l 
... 
>>> l1 = [1, 2, 3] 
>>> duplicate(l1) 
>>> l1 
[1, 2, 3] 

Я считаю, что функция выше дублирует список. Но почему результат не [1, 2, 3, 1, 2, 3]?Списки и функции Аргументы

+0

из-Scope? – Gogo

+0

@StevieG: нет, то же самое произойдет и вне функции: 'l = l1 + l1' все равно оставит' l1' неизменным. –

+0

Как в стороне, используя один строчный регистр L (l), просто нужно беспокоиться о путанице с одним (1) – Foon

ответ

4

Конкатенация двух объектов списка (как и с 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] 
+0

Спасибо! Меня смущает «l + l создает новый объект списка». Когда мы будем называть duplicate (l1), тогда будет выполняться тело функции (l1 = l1 + l1) и почему l1 - это новый объект списка? –

+0

Поскольку '+' конкатенация в объекте списка всегда создает новый экземпляр списка. –

+0

Ничего себе это действительно 412K repu?!. Я вдохновлен .... – repzero

Смежные вопросы