2013-06-28 4 views
1

Я пытаюсь создать функцию, которая возвращает все круговые числа из заданного числа, и это дает мне нечетный результат. Функция:Список Python append возвращает нечетные результаты

def getcircs(mylist): 
    circs=[] 
    x=mylist 
    y=list(x) 
    dig=len(x)-1 
    j=0 

    circs.append(x) 

    while j < dig: 
     for i in range(0,dig): 
      r=i+1 
      g=x[r] 
      y[i]=g 
     y[dig]=x[0]   
     print y 
     circs.append(y) 
     x=list(y) 
     j+=1 

    print circs 
    return circs 

И как вы можете видеть, когда вы запускаете его, списки «у» возвращаются, что я ищу, но список «материальное положение», кажется, не имеют права " y ', добавляя к нему значение. Мне интересно, если это проблема с списками ссылок на Python, но я не могу понять это. Благодарю.

+0

Что такое круговой номер? –

+0

Кроме того, одним словом да. Вы добавляете один и тот же список 'y' в' circs' несколько раз. –

ответ

1

Это потому, что списки являются справочными, и вы повторно используете y. Когда вы добавляете y в circs, circs получает другую ссылку на y. Когда вы позже измените y, вы увидите изменение в каждом месте в circs, где добавлено y. Попробуйте сделать копию y и работать с этим.

def getcircs(mylist): 
    circs=[] 
    x=mylist 
    y=list(x) 
    dig=len(x)-1 
    j=0 

    circs.append(x) 

    while j < dig: 
     temp = y[:] 
     for i in range(0,dig): 
      r=i+1 
      g=x[r] 
      temp[i]=g 
     temp[dig]=x[0]   
     print temp 
     circs.append(temp) 
     x=list(temp) 
     j+=1 

    print circs 
    return circs 

Линия temp = y[:] просто создает темп как полный срез у, который изначально производит копию.

+0

Спасибо. Я думал, что разобрался со всеми ссылочными вопросами, ясно, что это не так. Я ценю помощь. – TomR

1

Если вы хотите сделать это более простым способом (на мой взгляд, так или иначе), вы можете воспользоваться здесь itertools.cycle. Такой подход может быть очищен слишком, но вы получите идею:

import itertools 
my_list = [1, 2, 3, 4] 
cycler = itertools.cycle(my_list) 
list_size = len(my_list) 
for i in range(list_size): 
     print [cycler.next() for j in range(list_size)] # call next on the cycler generator 
     cycler.next() # skip the next number 

ВЫВОД

[1, 2, 3, 4] 
[2, 3, 4, 1] 
[3, 4, 1, 2] 
[4, 1, 2, 3] 

На самом деле, здесь есть один вкладыш для него:

print [[cycler.next() for j in range(list_size + 1)][:-1] for i in range(list_size)] 

OUTOUT

[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]