ошибка python: локальная переменная ‘a’, на которую ссылаются перед назначением

#python

#python

Вопрос:

Я пытаюсь создать функцию с интерактивным вводом, чтобы сообщить вам, какова формула ‘SMILES’ для жирной кислоты (химического соединения), но я продолжаю получать эту ошибку:

 def fatty_gen(chain_length, db_position, db_orientation):
    "Returns the SMILES code of the fatty acid, given its chain length, db position, db orientation"
    chain_length=input("What is the chain length/number of C?")
    chain_length2=int(chain_length)
    db_position = input("On which carbon does the double bond first appear")
    db_position2=int(db_position)
    db_orientation= input("What is the orientation of the double bond")
    db_orientation2=str(db_orientation)

    if db_orientation2 =="Z":
        a="/C=C\"
    elif db_orientation2=="E":
        a="C=C\"
    else: a =""

    return "C"*((db_position2)-1)   a   "C"*(chain_length2-db_position2-1)


<ipython-input-2-20b88ae22368> in fatty_gen(chain_length, db_position, db_orientation)
     13         a="C=C\"
     14 
---> 15     return "C"*((db_position2)-1)   a   "C"*(chain_length2-db_position2-1)
     16 fatty_gen(1,1,1)

UnboundLocalError: local variable 'a' referenced before assignment
 

UnboundLocalError: локальная переменная ‘a’, на которую ссылаются перед назначением

Комментарии:

1. a будет неопределенным, если не if будет выполнен ни один из блоков

2. @MosesKoledoye В этом случае, почему ‘if / elif’ не выполняется, несмотря на то, что он находится под моей функцией?

3. Предположительно , это значение не равно ни Z , ни E.

Ответ №1:

If db_orientation2 не является ни "Z" тем, ни "E" a другим, переменная не определена.

Вам нужно добавить else предложение, подобное этому:

 if db_orientation2 == "Z":
    a = "/C=C\"
elif db_orientation2 == "E":
    a = "C=C\"
else:
    a = "something else"
 

Комментарии:

1. Привет, спасибо за предложение, это действительно сработало. Однако теперь мой вывод показывает две обратные косые черты \ в строке вместо одной

2. Прочитайте об экранировании в строках python. Или используйте необработанные строки, такие как r'//'

Ответ №2:

 if db_orientation2 =="Z":
    a="/C=C\"
elif db_orientation2=="E":
    a="C=C\"
elif db_orientation2=="":
    a="/C=C\"
else: a=""
 

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