Как заполнить список

Мне нужно сделать функцию, которая принимает пустой список в качестве первого аргумента и n в качестве второго аргумента, так что:

L=[]
function(L,5)
print L
returns:
[1,2,3,4,5]

Я подумал:

def fillList(listToFill,n):
    listToFill=range(1,n+1)

но он возвращает пустой список.


person Linus Svendsson    schedule 08.12.2011    source источник


Ответы (5)


Рассмотрим использование extend:

>>> l = []
>>> l.extend(range(1, 6))
>>> print l
[1, 2, 3, 4, 5]
>>> l.extend(range(1, 6))
>>> print l
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

Если вы хотите сделать функцию (делая то же самое):

def fillmylist(l, n):
    l.extend(range(1, n + 1))
l = []
fillmylist(l, 5)
person tito    schedule 08.12.2011

Функция без явного указания return или yield возвращает None. То, что вы хотите, это

def fill_list(l, n):
    for i in xrange(1, n+1):
        l.append(i)
    return l

но это очень непитоново. Вам лучше просто вызвать range(1, n+1), который также возвращает список [1,2,3,4,5] для n=5:

def fill_list(n):
    return range(1, n+1)
person Fred Foo    schedule 08.12.2011
comment
Функция не должна ничего возвращать, а заполнять переданный ей список целыми числами от 1 до n. - person Linus Svendsson; 08.12.2011
comment
@LinusSvendsson: тогда удали return из моего предложения. - person Fred Foo; 08.12.2011
comment
функция должна принимать два аргумента: список для заполнения и n! - person Linus Svendsson; 08.12.2011
comment
@LinusSvendsson: мое первое предложение делает это. - person Fred Foo; 08.12.2011

И немного более короткий пример того, что вы хотите сделать:

l = []
l.extend(range(1, 5))
l.extend([0]*3)

print(l)
person user5214530    schedule 24.09.2019

In

def fillList(listToFill,n):
    listToFill=range(1,n+1)

вы меняете только указатель listToFill, если не возвращаете указатель new; новый указатель недоступен из функции, и у вас все еще есть указатель вашего пустого списка (во внешней области).

person Themerius    schedule 08.12.2011

  • Если вы делаете:

def fillList(listToFill,n): listToFill=range(1,n+1)

новый список создается внутри области действия функции и исчезает, когда функция завершается. бесполезный.

  • С :

def fillList(listToFill,n): listToFill=range(1,n+1) return listToFill()

вы возвращаете список, и вы должны использовать его следующим образом:

newList=fillList(oldList,1000)
  • И, наконец, без возврата аргументов:

def fillList(listToFill,n): listToFill.extend(range(1,n+1))

и назовите это так:

fillList(oldList,1000)

Вывод:

Внутри функции, если вы хотите изменить аргумент, вы можете переназначить его и вернуть, или вы можете вызвать методы объекта и ничего не вернуть. Вы не можете просто переназначить его, как если бы вы были вне функции и ничего не возвращали, потому что это не будет иметь эффекта вне функции.

person Antoine Gallix    schedule 05.03.2014