#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)