Доступ к переменной из определенной функции в цикле while

У меня есть код, похожий на этот

v = '0' def program(): x = input('1 or 2 ') if x == '1': print('it is 1') v = '1' elif x == '2': print('it is 2') v = '2' while True: program() print(v) 

Однако, когда я запускаю этот код, переменная 'v' всегда выводит значение по умолчанию 0. Почему он не дает мне переменную, которую я назначил ей в функции?

У вас есть две переменные с именем v :

  1. Объявление верхнего уровня v=0 вверху.
  2. Объявление функции v в программе.

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

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

Также обратите внимание, что вам нужно использовать raw_input в Python 2.

 def program(): global v x = raw_input('1 or 2 ') if x == '1': print('it is 1') v = '1' elif x == '2': print('it is 2') v = '2' 

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

Ваша функция управляет локальной копией переменной v . Если вы хотите получить значение v после вызова program() , добавьте return v в конец определения функции. То есть:

 v = '0' def program(): x = input('1 or 2 ') if x == '1': print('it is 1') v = '1' elif x == '2': print('it is 2') v = '2' return v while True: v = program() print(v) 

Если вы ничего не хотите возвращать, вы можете установить v на глобально объявленную переменную так:

 v = '0' def program(): x = input('1 or 2 ') if x == '1': print('it is 1') global v v = '1' elif x == '2': print('it is 2') global v v = '2' while True: program() print(v) 

В дополнение к дубликатному флагом, вот объяснение в отношении вашего кода:

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

Чтобы исправить это, вы хотите добавить global v внутри своего метода:

 def program(): global v # rest of your code here 

Это должно сработать.

Переменные назначения в Python локально ограничены. Если вы хотите манипулировать глобальным состоянием (или охватывающим состоянием) внутри функции, вы можете обернуть это состояние в держатель, а затем обратиться к держателю. Например:

 v = ['0'] def program(): x = input('1 or 2 ') if x == '1': print('it is 1') v[0] = '1' elif x == '2': print('it is 2') v[0] = '2' while True: program() print(v[0]) 

Вышеупомянутый сегмент ссылается на массив и манипулирует значением внутри массива.