2013-11-02 8 views
0

Я пытаюсь изменить значение списка, которое я поставил в качестве аргумента в функции.Python, изменить значение аргументов внутри функции

это код:

def shuffle(xs,n=1): 
if xs: #if list isn't empty 
    if n>0: 
     #gets the index of the middle of the list 
     sizel=len(xs) 
     midindex=int((sizel-1)/2) 
     for times in range(n): 
      xs=interleave(xs[0:midindex],xs[midindex:sizel]) 
return None 

Код перемежать возвращает список со значениями обоих списков перепутаны.

Однако, когда я бегу:

t=[1,2,3,4,5,6,7] 
shuffle(t,n=2) 
print t 

Список т не изменил его порядок. Функция должна возвращать None, поэтому я могу использовать jst t = shuffle (t, n). Так или иначе, я могу это сделать?

+0

* «Функция должна возвращать None, поэтому я могу использовать jst t = shuffle (t, n).» * - это не имеет никакого смысла. Почему вы не возвращаете xs в конце вашей функции 'shuffle', а затем выполняете' t = shuffle (t, n) '? –

+1

Почему он должен возвращать 'None'? (что, кстати, по умолчанию, когда вы опускаете оператор возврата) – StoryTeller

+0

Я объяснил в комментарии к первому ответу. Спасибо за помощь – Findios

ответ

2

xs является ссылкой, относящейся к функции, и является независимым от t. Когда вы переназначаете xs, t все еще указывает на первоначальный список.

Поскольку вы не должны ничего возвращать из функции, обходной путь, чтобы сохранить ссылку на исходный список и заселить его с помощью назначения ломтика:

orig_xs = xs 
# do stuff here 
orig_xs[:] = xs 
+0

Итак, я не могу изменить t внутри функции? – Findios

+0

@Findios, см. Мое недавнее редактирование – StoryTeller

+0

В настройках специально говорится, что функция должна возвращать None. Когда я искал эту строку, я увидел, что списки изменяемы, поэтому я должен это сделать. – Findios

2

Ваша проблема находится прямо здесь:

xs=interleave(xs[0:midindex],xs[midindex:sizel]) 

Вы делаете кусочки списка, чтобы перейти к своей функции interleave(). Это, по сути, копии части списка. Нет никакого способа, чтобы то, что возвращается от функции, может быть чем угодно, чем другой список от xs.

К счастью, вы можете просто переназначить новый список, который вы вернетесь в исходный список. То есть, держите xs, указывая на тот же список, но замените все предметы в нем с тем, что вы получаете от функции interleave().

xs[:]=interleave(xs[0:midindex],xs[midindex:sizel]) 

Это называется назначением среза. Поскольку xs остается тем же самым списком, который был передан, все ссылки на список вне функции также будут видеть изменения.

+0

Работал! Огромное спасибо. – Findios

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