Определение области действия переменных кортежа в операторе if в Python

#python #if-statement #scope #tuples

#python #if-statement #область видимости #кортежи

Вопрос:

Как я могу получить доступ к кортежу, инициализированному в операторе if /else, без использования tuple() list() функций and ?

У меня есть этот код:

 if x > y:
    foo = (a, b)
elif y > x:
    foo = (b, a)

(tmp1, tmp2) = foo
  

но python возвращает: UnboundLocalError: local variable 'foo' referenced before assignment .

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

Важно: мне нужно работать с кортежем, а не со списком.

Обновление: мне не нужен регистр x == y , поэтому я изменил свой код, добавив дополнительное условие:

 foo = None
if x > y:
    foo = (a, b)
elif y > x:
    foo = (b, a)

if foo != None:
    (tmp1, tmp2) = foo
  

Update2: Или, аналогично:

 if x > y:
    foo = (a, b)
elif y > x:
    foo = (b, a)
else:
    foo = ()

if len(foo) > 0:
    (tmp1, tmp2) = foo
  

Ответ №1:

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

Единственная причина, по которой foo здесь не определено, заключается в том, что вы забыли условие: когда x и y равны.

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

1. Да, я знаю, но мне не нужно это условие. В любом случае, я решил добавить еще одно условие : if edge != None: ... . Спасибо.

Ответ №2:

Это должно сработать, но попробуйте явно объявить foo перед блоком if-else

 x=3
y=2
a=1
b=2
foo=None #tell python foo must be reserved at this scope level
if x > y:
    foo = (a, b)
elif y > x:
    foo = (b, a)
elif y == x: #need to remember this case
    foo = (b, a)

(tmp1, tmp2) = foo
  

Ответ №3:

В одной строке, предполагая, что вы забыли регистр x == y в своем коде:

 (tmp1, tmp2) = (a, b) if x > y else (b, a)
  

Но если вы хотите сохранить свой синтаксис, просто не забудьте == условие!

 if x > y:
    foo = (a, b)
else:
    foo = (b, a)

(tmp1, tmp2) = foo
  

(отредактировано после ответа @Daniel Roseman)