2016-02-07 3 views
0

Это моя попытка вставного рода в Python:Правильно ли это сортировка?

def insert(alis): 
    for i in range(1,len(alis)): 
     currel = alis[i] 
     j = i 
     while j > 0 and alis[j]<alis[j-1]: 
      alis[j] = alis[j-1] 
      alis[j-1]= currel 
      j=j-1 
    print (alis) 

alis = [3,2,6,2,1,678,23,98] 
insert(alis) 

Это похоже на работу, но дело в том, что озадачивает меня, скажет

alis = [4,3,2,1] 

После i = 1, alis = [3,4,2,1]. Поэтому, когда alis[2] установлено на 4, это не изменит значение currel от 2 до 4? Значит, вы бы получили [3,4,4,1]? Но похоже, что это не так.

ответ

0

В списке alis содержатся ссылки на другие объекты; alis[2] ссылки int объект 4. Установка currel = alis[2] создает другую ссылку на тот же объект.

Изменение alis[2] для ссылки на другой объект не влияет на currel, однако. Вы не меняете объект 4, вы меняете то, что ссылается на объект списка. Таким образом, currel не изменяется. currel продолжает ссылаться на объект 4, без изменений.

Возможно, вы захотите прочитать (отличное) объяснение. Нед Батчелдер дает в своей презентации на конференции Python 2015 презентацию: Python Names and Values. Вы также можете использовать pythontutor.com для визуализации того, что происходит с вашими переменными; см. your code on that site.

+0

Но так как куррель связан с alis на «i», не будет ли изменение в alis эффектом currel? – ls9

+0

Это * не * связано с 'alis'. Он связан со значением, которое имеет ссылка 'alis [i]' * * *. –

+0

Извините, но я все равно не понимаю. Но, с другой точки зрения, могу ли я правильно сказать, что куррель остается значением, которое он задал до цикла while, потому что вы не вернулись и не обновили currel после цикла while? По этому рассуждению значение курсора остается неизменным до тех пор, пока мы не перейдем к следующему значению i, поэтому вся система работает. – ls9

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