#python-3.x
#python-3.x
Вопрос:
В настоящее время у меня есть функция вставки, которая работает без проблем и возвращает тот же массив, но поменян местами. Я заметил, что всякий раз, когда я делаю следующее:
if __name__ == '__main__':
testing_arrays = [2, 8, 5, 3, 9, 4]
print("Original array {} vs Sorted Array {}".format(testing_arrays, insertion_sort(testing_arrays)))
Это приводит к печати двух отсортированных массивов. Я бы ожидал, что сначала будет напечатан несортированный, а затем отсортированный массив после вызова функции, но это не так.
Я понимаю, что я мог бы просто объявить другое значение для того же массива, но я хочу понять, почему это происходит? Я бы подумал, что он не будет записывать в память перед вызовом функции в print.format
функции? Даже если вы объявите значение, в котором хранится результирующий отсортированный массив, это будет та же проблема, которая очень интересна.
На случай, если это было необходимо, вот моя функция сортировки вставки:
def insertion_sort(unsorted_array=None):
for value in unsorted_array:
#This checks whether we are at the first item or not
#Insertion sort works by looking at the left elements
#Since index 0 does not have any, we continue.
if unsorted_array.index(value) == 0:
print("We Skipped Value {} at index {} since it is the first element".format(value, unsorted_array.index(value)))
continue
index_counter = unsorted_array.index(value) - 1
current_index = unsorted_array.index(value)
while index_counter > 0:
#We check if a value is bigger than our current index value
if unsorted_array[index_counter] > unsorted_array[current_index]:
#We swap the values
temp = unsorted_array[current_index]
unsorted_array[current_index] = unsorted_array[index_counter]
unsorted_array[index_counter] = temp
#We decrease the indexes looked at to keep comparing
index_counter = index_counter - 1
current_index = current_index - 1
print("Index Couter is currently {}".format(index_counter))
else:
#We decrease the index counter here because if a right before is not bigger,
#We can continue looking at indexes before.
index_counter = index_counter - 1
continue
print("Progress of array is {}".format(unsorted_array))
return unsorted_array
Ответ №1:
На самом деле insertion_sort
функция вызывается перед format
вызовом, потому что это аргумент format
функции. Текущая insertion_sort
функция возвращает переданный список, а список в Python можно изменять, поэтому он в основном передает один и тот же массив в format
вызов функции. Вот почему нам нужно создать новый массив внутри insertion_sort
функции и возвращает новый отсортированный массив. Надеюсь, это поможет вам правильно понять проблему.
Комментарии:
1. Интересно. Итак, поскольку это аргумент, он будет вызываться и запускаться до печати формата, что повлияет на оба массива, поскольку они одинаковые в памяти. Но есть ли другой способ добиться необходимого результата без создания дополнительных сложностей с пространством?
2. Нет, потому что, как я уже сказал, list является изменяемым объектом в Python, поэтому для одновременной печати как исходного, так и отсортированного списка нам определенно нужны два списка.