Array печатает результат перед вызовом функции в формате .format?

#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, поэтому для одновременной печати как исходного, так и отсортированного списка нам определенно нужны два списка.