Как получить доступ к переменным после условия if, когда переменная определена внутри условия if в python - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужно получить доступ к переменной извне условия if, когда переменная создается внутри условия if в python.Типы переменных, которые находятся внутри условия if: test - это <type, str>, а vn - это <type, instance>.

. Я пробовал описанный ниже способ, но у меня это не сработало.

В приведенном ниже коде мне нужно получить доступ к vn и test переменным

for DO in range(count) :
    atnnames = doc.getElementsByTagName("atnId")[DO]
    atn = atnnames.childNodes[0].nodeValue
    if atn == line[0]:
        vn = doc.getElementsByTagName("vn")[DO]
        vncontent = vn.childNodes[0].nodeValue
        y = vncontent.encode('utf-8')
       # print y
        if '-' in y:
            slt = (int(y.split('-')[0][-1]) + 1)
            test = y.replace(y.split('-')[0][-1], str(slt))
       #     print test
        else:
            slt = (int(y.split('.')[-1]) + 1)
            test = y.replace(y.split('.')[-1], str(slt))
       #     print test
    else:
        #print test
        vn.firstChild.nodeValue = test
print vn.firstChild.nodeValue

Ошибка, которую я получаю при запуске приведенного выше кода:

UnboundLocalError: local variable 'test' referenced before assignment

Я пытался определить переменные как None перед циклом for.

и он выбрасывает ниже ошибки.AttributeError: 'NoneType' object has no attribute 'firstChild'

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Похоже, ваша проблема в том, что вы ссылаетесь на переменную вне ее области видимости.По сути, то, что происходит, в вашем утверждении if, вы создаете переменную исключительно для использования в рамках if.Фактически, когда вы сказали print vn.firstChild.nodeValue, вы также можете представить его как любую другую переменную, такую ​​как print undefinedVar.Происходит то, что вы ссылаетесь (вызываете) на переменную еще до того, как она была определена.

Однако не стоит беспокоиться, поскольку это очень легко исправить.Что мы можем сделать, это просто создать свой vn и протестировать переменные вне области действия if, то есть внутри вашего фактического метода, выполнив следующее:

vn = None
test = None

for DO in range(count) :
    atnnames = doc.getElementsByTagName("atnId")[DO]
    atn = atnnames.childNodes[0].nodeValue
    if atn == line[0]:
        vn = doc.getElementsByTagName("vn")[DO]
        vncontent = vn.childNodes[0].nodeValue
        y = vncontent.encode('utf-8')
       # print y
        if '-' in y:
            slt = (int(y.split('-')[0][-1]) + 1)
            test = y.replace(y.split('-')[0][-1], str(slt))
       #     print test
        else:
            slt = (int(y.split('.')[-1]) + 1)
            test = y.replace(y.split('.')[-1], str(slt))
       #     print test
    else:
        #print test
        vn.firstChild.nodeValue = test
print vn.firstChild.nodeValue

Это просто создает пустую переменную во внешней области видимости.Я установил значения None, так как они будут определены после запуска цикла for.Итак, что происходит сейчас, у вас есть переменная, которая была объявлена ​​снаружи и в начале имеет значение None, но когда вы запускаете цикл for, вы не создаете временную переменную только внутри оператора if, но вы фактически меняетезначение

0 голосов
/ 11 февраля 2019

задайте переменную перед блоком if с помощью None, затем обновите ее в блоке if.Учтите следующее:

y = None
x = 1
print(y)
if x == 1:
    y = "d"
else:
    y = 12
print(y)
...