2013-10-05 9 views
-4

Перед запуском функции ниже l1 является пустым списком, но почему это [1, 2, 3] после запуска функции?область действия функции python

def copylist(lsource, ldest): 
    for e in lsource: 
     ldest.append(e) 
    print 'ldest =',ldest 


l1 = [] 
l2 = [1, 2, 3] 
copylist(l2, l1) 
print l1 # displays [1, 2, 3] 
print l2 # displays [1, 2, 3] 
+4

Потому что именно так вы написали функцию? Он копирует данные из 'lsource' в' ldest', поэтому он копирует его в 'l1'. – BrenBarn

+1

Я ниспровергаю, потому что, основываясь на комментариях к ответам, этот вопрос больше, чем вы писали выше. Если вы хотите получить полный ответ, вам нужно задать полный вопрос. – SethMMorton

+0

Поскольку функция работает правильно. Что вы ожидали? –

ответ

1

Похоже, что вы ожидали, что списки обрабатываются как передаваемые по значению, так как это может быть на каком-то другом языке. Аргументы Python больше похожи на pass-by-reference, и поскольку списки являются изменяемыми, они сделали именно то, что вы просили.

Чем больше вы знакомы с Python, тем более очевидным, естественным и даже удобным будет это.

0

python передает объекты по ссылке. Это означает, что вы добавляете элементы в фактический объект, который вы передали.

+0

Так почему же ** печатать cat ** после вызова функции не отображать ** Bing tiddletiddle bang ** в коде [link] (http://pastebin.com/YrPjb2vt) –

+0

@MikeSila Почему вы не копируете и не копируете вставьте код в ссылку в свой вопрос, а не заставляйте других людей искать его? – SethMMorton

+0

@MikeSila, потому что 'cat' внутри ссылки кода определяет новую переменную, которая видима только внутри функции. Операция '+' создает новый список с копиями содержимого двух параметров и присваивает его 'cat'. –

0

Для каждого элемента lsource, если он присутствует в ldest, он будет добавлен к ldest. По этой причине все элементы l2 копируются в ( не перемещены в) l1.

0

Что такое ldest? Это то, с чем вы проходили. В этом случае вы прошли в l1. ldest и l1 - это тот же список. Поэтому не имеет значения, какое имя вы используете для ссылки на объект.

+0

Итак, почему ** print cat ** после вызова функции не отображается ** Bing tiddletiddle bang ** в коде [link] (http://pastebin.com/YrPjb2vt) –

+0

Зачем вам это ожидать? Вы присваиваете 'cat'' 'part1 + part2', в котором он больше не ссылается на переданное значение. Вы не переназначаете что-либо в коде вашего вопроса (' ldest' относится к тому же в течение всего функция). – kindall

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