Я пытался понять, как работает следующий код,

def mergeSort(a):
    if len(a) > 1:
        mid = len(a)//2
        left = a[:mid]
        right = a[mid:]
        mergeSort(left)
        mergeSort(right)

        i = j = k = 0

        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                a[k] = left[i]
                i += 1
            else:
                a[k] = right[j]
                j += 1
            k += 1

        while i < len(left):
            a[k] = left[i]
            i += 1
            k += 1

        while j < len(right):
            a[k] = right[j]
            j += 1
            k += 1
    return a

С Репетитор по Python, когда я заметил, что цикл while манипулирует списком A из предыдущего вызова. Для меня это выглядит так, будто это выходит за рамки, но это явно не так.

Можете ли вы сказать мне, что мне не хватает, что я думаю, это замена элементов списка вне области видимости?

0
Ádám Palkovics 23 Июл 2020 в 18:22
1
Как вы думаете, где проблема?
 – 
Sai Sreenivas
23 Июл 2020 в 18:24
Пожалуйста, покажите некоторые результаты и объясните, что вы ожидаете вместо этого.
 – 
Code-Apprentice
23 Июл 2020 в 18:25

1 ответ

Лучший ответ

Не существует такого понятия, как «действие вне рамок». Правила Python гарантируют, что переменная может быть изменена только тогда, когда она находится в области видимости.

Однако иногда несколько переменных относятся к одному и тому же объекту. В случае функции это часто происходит с передачей по ссылке. Вот пример:

def change_element(a):
   a[1] = 42

x = list(range(10)
print(x)
change_element(x)
print(x)

Здесь вы увидите изменения элемента x, потому что список передается в change_element() по ссылке. Это означает, что x и a оба относятся к одному и тому же объекту списка.

Ваш пример действительно делает именно такие вещи.

0
Code-Apprentice 23 Июл 2020 в 18:29