На самом деле несоответствия нет, поскольку приведенные вами примеры отличаются друг от друга. Во второй функции все равно не получится, если вы попытаетесь присвоить себе x
, например:
>>> x = 3
>>> def price():
... x +=3
... return x
...
>>> price()
UnboundLocalError: local variable 'x' referenced before assignment
Вместо того, чтобы возвращать x
, если вы выберете другое имя, он будет работать без проблема:
>>> def price():
... y = x + 3
... return y
...
>>> price()
6
Но почему это происходит?
Это из-за правил области видимости Python. Вы можете прочитать значение переменной вне функции, но вы не можете изменить это **. Когда вы выполняете x += 3
, что аналогично x = x + 3
для целых чисел, это означает: « У меня есть переменная x
, к которой у меня есть доступ на запись в текущей области. » У вас нет есть такая переменная, поэтому, как говорится в ошибке: вы ссылаетесь на «локальную переменную» перед назначением.
Есть ли способ изменить их в функции?
Да. Вы можете использовать ключевое слово global
, изменения будут применены к вашей глобальной переменной:
>>> x = 3
>>> def price():
... global x
... x += 3
... return x
...
>>> x
3
>>> price()
6
>>> x
6
** Под изменением , я имею в виду присвоение ему чего-то еще, чтобы он id
изменение.