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

#python #python-3.x #function #if-statement #rdkit

#питон #python-3.x #функция #if-оператор #rdkit

Вопрос:

У меня есть этот фрагмент кода, который на самом деле не хочет работать. Я уже пытался использовать Global, но это выдало мне другую ошибку error (она говорит мне, что ff_cog не определен таким образом), я попытался изменить позицию «numat», которая раньше была над оператором if, но ничего не изменилось. Может кто-нибудь мне помочь, пожалуйста? Я на 100% уверен, что есть valuee больше, чем dp. Этот оператор if следует использовать для выбора наименьшего расстояния между всеми атомами, когда они вычисляются. Я не могу понять, почему это создает у меня такую проблему. Я использую аналогичный цикл for еще два раза в своей программе, и, кажется, он работает просто отлично. Это первый раз, когда я сталкиваюсь с этой ошибкой. заранее большое спасибо

 def ff(furthestcoord):
   #global ff_cog
   numat=0
   dp=np.zeros(0)
   for atom in mol.GetAtoms():
       atom_pos=np.array(mol.GetConformer().GetAtomPosition(numat))
       ffdist=np.array(np.linalg.norm(furthestcoord-atom_pos))
       print("this is ffdist",ffdist)
       if ffdist > dp:
            dp = atom_pos
            ff_cog = atom_pos
       else: pass
       numat =1
   return ff_cog
``


 

Ответ №1:

 if ffdist > dp:
   dp = atom_pos
   ff_cog = atom_pos
 

Если условие этого оператора if не выполняется, то ff_cog он никогда не будет инициализирован. Вот почему вы получаете эту ошибку. Вы можете попробовать инициализировать ff_cog начальное значение, чтобы избежать ошибки.
Вы можете сделать что-то вроде ff_cog = 0 или ff_cog = None в начале вашей функции.

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

1. хорошо, я ll Try asap, but the problem is that I возвращаю ff_cog вне цикла for, поэтому технически он должен дать мне последний сохраненный ff_cog (который меня интересует, поскольку он должен иметь более высокое значение). я прав?

2. @DavideAnnese если это условие ffdist > dp выполняется хотя бы один раз, то все в порядке. Но, если это условие никогда не выполняется, тогда не будет «последнего ff_cog».

3. хорошо, мне удалось заставить это работать, проблема заключалась в том, что после оператора if в первой строке, если оператор удовлетворен, я выполнял dp = atom_pos , но правильная форма — это dp=ffdist потому, что я хочу, чтобы она была сохранена и сравнивалась с ffdist, созданным на последовательном атоме.