Параметр теневого копирования в Python функциях - PullRequest
0 голосов
/ 14 апреля 2020

Я немного запутался в отношении переменных в Python, просто искал пояснения.

В следующем коде я передам глобальную переменную в свою собственную функцию Python, которая просто принимает значение и умножает его на 2. Очень просто. Не возвращает переменную после. Выходные данные функции print в конце печатают 10500, а не 21000, указывая, что локальная переменная, созданная в функции, фактически не редактировала глобальную переменную, которая была передана, а скорее использовала значение в качестве аргумента.

balance = 10500

def test(balance):
    balance = balance * 2

test(balance)
print(balance)

Однако в моем втором фрагменте кода здесь, когда я передаю список / массив в отдельную функцию для пузырьковой сортировки, редактируется реальный массив, а не функция, использующая только ценности.

def bubble_sort(scores):
    swapped = True
    while swapped:
        swapped = False
        for i in range(0, len(scores)-1):
            if scores[i] > scores[i+1]:
                temp = scores[i]
                scores[i] = scores[i+1]
                scores[i+1] = temp
                swapped = True

scores = [60, 50, 60, 58, 54, 54]

bubble_sort(scores)
print(scores)

Теперь, когда я распечатываю свой список результатов, он сортируется. Меня смущает, почему верхняя функция не изменила глобальную переменную, которая была ей передана, а вторая -? Я понимаю, что использование ключевого слова global в функциях означает, что я все еще могу писать код, который будет редактировать глобальную переменную в моих собственных функциях, но, возможно, мне не хватает базовых c понимания.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

В обеих функциях глобальная переменная затеняется локальной переменной.

В тестовой функции глобальные и локальные переменные начинаются с указания на одно и то же значение, но локальная переменная переназначается на другое значение .

В функции bubble_sort глобальные и локальные переменные также начинаются с указания на одно и то же значение. На этот раз вместо переназначения локальной переменной на новое значение вы изменяете объект, на который она указывает. Если в функции bubble_sort вы переназначите локальную переменную, вы получите результат, аналогичный вашей тестовой функции.

0 голосов
/ 14 апреля 2020

Я думаю, что ваше замешательство связано с изменчивостью.

Интты неизменны. При первоначальном назначении баланса, поскольку он является целым, значение баланса не изменится, если вы не переназначите его. Вы знаете это, потому что вы переназначаете это в своем определении. Однако путаница в вашей ситуации заключается в том, что на самом деле есть две переменные баланса. Глобальный и тот, который существует внутри вашей функции каждый раз, когда вы вызываете. Назначение, которое происходит внутри вашей функции, на самом деле не влияет на назначение глобальной переменной. Он вдвойне ничего не делает, потому что нет возвращаемого значения.

Чтобы реально что-то изменить, вы захотите

def test(balance):
    balance = balance * 2
    return balance

balance = test(balance)

Ситуация со списком отличается, потому что списки на самом деле являются изменяемыми. Это делает так, что когда вы меняете значения в баллах, вы действительно меняете значения в баллах. И поэтому, когда вы вызываете свою функцию для нее, она меняет вещи без необходимости переназначения.

Обычно это ситуация запоминания свойств, присущих типам данных в python. Некоторые вещи изменчивы, а некоторые нет. Вы, вероятно, можете быстро составить график в Google, и чем больше вы будете работать в python, то вспомните, что различия становятся второй натурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...