2014-10-22 2 views
1

У меня есть следующий код Python:Объект имеет значение, но, похоже, не существует?

if bedrooms: # bedrooms exists 
    ..... 
else: # BEDROOMS DOES NOT EXIST 
    bn = "BEDROOMS DOES NOT EXIST" 

Я шаговый через него в моем отладчик и заметил, что даже если bedroom == 0, поток переходит к else заявление.

Чтобы проверить это, я попробовал:

>>> bedrooms 
0.0 
>>> type(bedrooms) 
<type 'float'> 

Может кто-нибудь объяснить, что здесь происходит?

+1

'0' - значение фальши, то есть если вы конвертируете' 0' в логическое значение, результатом будет 'False'. –

+0

'Если спальни ** не проверяет, существуют ли' спальни' * - если это не так, вы получите 'NameError'. Он проверяет, оценивает ли объект, назначенный этому имени true-y или false-y. – jonrsharpe

+0

Спасибо, я не понял, что – user61629

ответ

6

0 всегда имеет значение False в Python:

>>> bool(0) 
False 
>>> bool(0.0) 
False 
>>> not 0 
True 
>>> 

последовательно, как это сделать:

if 0: 
    ... 
else: 
    ... 

всегда будет вызывать else блок для выполнения.

Полный список результатов False, см. Truth Value Testing в документах Python.


Если вы хотите проверить, если bedrooms определена, то вы могли бы использовать try/except блок и поймать за NameError (который возникает при использовании несуществующее имя):

try: 
    bedrooms 
except NameError: 
    # bedrooms is not defined 

Но это возникает вопрос, почему вам нужно это делать в первую очередь. Если это связано с именами динамических переменных, то я хотел бы сказать, что большинство программистов на Python считают плохой практикой, и их следует избегать. Они могут быстро привести к проблемам обслуживания, и очень легко потерять имена созданных им имен.

+0

Спасибо за объяснение, я собираюсь изменить функцию, возвращающую спальни, чтобы вернуть строку «INVALID», когда номер спальни не найден, и я проверю на это - Билл – user61629

+1

@ user61629 - Обратите внимание, что идиоматическим способом представления «номера спальни» является возврат «Нет». Затем вы можете использовать 'if bedrooms is None:', чтобы проверить его. – iCodez

+0

Большое спасибо! Вместо этого я использовал None. – user61629

Смежные вопросы