Правильность о переменном объеме

Я в настоящее время разрабатываю некоторые вещи в Python, и у меня есть вопрос об объеме переменных.

Это - код:

a = None
anything = False
if anything:
    a = 1
else:
    a = 2

print a # prints 2

Если я удаляю первую строку (= Ни один), код все еще работает как прежде. Однако в этом случае я объявил бы переменную в, "если" блок, и относительно других языков как Java, та переменная только будет видима в "если".

Как точно переменные работы обзора в Python и что проку способ программировать в случаях как это?

Спасибо!

7
задан Menda 1 March 2010 в 22:54
поделиться

5 ответов

Как правило, области видимости создаются в трех местах:

  1. Область видимости файла - иначе известная как область видимости модуля
  2. Область действия класса - создается внутри блоков class
  3. Область действия функции - создается внутри блоков def

(Есть несколько исключений из них.)

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

8
ответ дан 6 December 2019 в 23:04
поделиться

Python не требует первоначального объявления переменных, поэтому вы можете объявлять и определять их в произвольных точках. И да, область видимости - это область видимости функции, поэтому она будет видна за пределами if .

0
ответ дан 6 December 2019 в 23:04
поделиться

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

полезную информацию также можно найти в разделе «области действия и пространства имен» на той же странице.

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

if len(sys.argv)==2:
    f = open(sys.argv[1], 'r')
else:
    print ('provide input file')

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

надеюсь, что это поможет.

0
ответ дан 6 December 2019 в 23:04
поделиться

Я считаю, что 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.

2
ответ дан 6 December 2019 в 23:04
поделиться

Нет проблем с назначением переменной в блоке if .

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

Если одна из ветвей не назначила , то при попытке распечатать его после этой ветки возникнет исключение NameError

1
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: