Я в настоящее время разрабатываю некоторые вещи в Python, и у меня есть вопрос об объеме переменных.
Это - код:
a = None
anything = False
if anything:
a = 1
else:
a = 2
print a # prints 2
Если я удаляю первую строку (= Ни один), код все еще работает как прежде. Однако в этом случае я объявил бы переменную в, "если" блок, и относительно других языков как Java, та переменная только будет видима в "если".
Как точно переменные работы обзора в Python и что проку способ программировать в случаях как это?
Спасибо!
Как правило, области видимости создаются в трех местах:
class
def
(Есть несколько исключений из них.)
Присвоение имени резервирует его в пространство имен области, помеченное как несвязанное до достижения первого назначения. Итак, для ментальной модели вы присваиваете значения именам в области видимости.
Python не требует первоначального объявления переменных, поэтому вы можете объявлять и определять их в произвольных точках. И да, область видимости - это область видимости функции, поэтому она будет видна за пределами if
.
Я довольно начинающий программист, но для что я знаю, в python частных переменных не существует. см. частные переменные в документации Python для подробного обсуждения.
полезную информацию также можно найти в разделе «области действия и пространства имен» на той же странице.
лично я пишу код, подобный тому, который вы опубликовали, почти каждый день, особенно когда условие зависит от получения ввода от пользователя, например
if len(sys.argv)==2:
f = open(sys.argv[1], 'r')
else:
print ('provide input file')
я объявляю переменные перед их использованием для структурированных типов, например, я объявляю пустой список перед добавлением его элементов в цикл.
надеюсь, что это поможет.
Я считаю, что Python использует область видимости функций для локальных переменных. То есть в любой данной функции, если вы присваиваете значение локальной переменной, оно будет доступно с этого момента внутри этой функции до тех пор, пока не вернется. Следовательно, поскольку обе ветви вашего кода гарантированно будут назначать a
, нет необходимости изначально назначать None
для a
.
Обратите внимание, что когда вы также можете обращаться к переменным, объявленным во внешних функциях - другими словами, Python имеет замыкания.
def adder(first):
def add(second):
return first + second
return add
Это определяет функцию, называемую сумматором.При вызове с аргументом first
он вернет функцию, которая добавляет любой полученный аргумент к first
и возвращает это значение. Например:
add_two = adder(2)
add_three = adder(3)
add_two(4) # = 6
add_three(4) # = 7
Однако, хотя вы можете прочитать значение из внешней функции, вы не можете его изменить (в отличие от многих других языков). Например, представьте, что пытаетесь реализовать аккумулятор. Вы можете написать такой код:
def accumulator():
total = 0
def add(number):
total += number
return total
return add
К сожалению, попытка использования этого кода приводит к сообщению об ошибке:
UnboundLocalError: local variable 'total' referenced before assignment
Это потому, что строка total + = number
пытается изменить значение total
, чего нельзя сделать в Python.
Нет проблем с назначением переменной в блоке if
.
В этом случае он назначается для обеих веток, поэтому вы можете видеть, что он определенно будет определен, когда вы придете его распечатать.
Если одна из ветвей не назначила
, то при попытке распечатать его после этой ветки возникнет исключение NameError