为什么将“ 0”和“ 0”评估为False?

时间:2019-07-27 22:18:40

标签: python

我在考虑是否要检查字符串或字符的布尔值,是否要检查它们是否为空。但是以下代码给了我意外的输出。

print('0'==True)
print("0"==True)

输出:

False
False

发生了什么事?我们真正在检查什么?

4 个答案:

答案 0 :(得分:5)

它们是真的(在布尔上下文中):

Gems included by the bundle:
  * activesupport (4.2.11.1)
  * addressable (2.6.0)
  * bundler (2.0.2)
  * coffee-script (2.4.1)
  * coffee-script-source (1.11.1)
  * colorator (1.1.0)
  * commonmarker (0.17.13)
  * concurrent-ruby (1.1.5)
  * dnsruby (1.61.2)
  * em-websocket (0.5.1)
  * ethon (0.12.0)
  * eventmachine (1.2.7)
  * execjs (2.7.0)
  * faraday (0.15.4)
  * ffi (1.11.1)
  * forwardable-extended (2.6.0)
  * gemoji (3.0.1)
  * github-pages (198)
  * github-pages-health-check (1.16.1)
  * html-pipeline (2.11.1)
  * http_parser.rb (0.6.0)
  * i18n (0.9.5)
  * jekyll (3.8.5)
  * jekyll-avatar (0.6.0)
  * jekyll-coffeescript (1.1.1)
  * jekyll-commonmark (1.3.1)
  * jekyll-commonmark-ghpages (0.1.5)
  * jekyll-default-layout (0.1.4)
  * jekyll-feed (0.11.0)
  * jekyll-gist (1.5.0)
  * jekyll-github-metadata (2.12.1)
  * jekyll-mentions (1.4.1)
  * jekyll-optional-front-matter (0.3.0)
  * jekyll-paginate (1.1.0)
  * jekyll-readme-index (0.2.0)
  * jekyll-redirect-from (0.14.0)
  * jekyll-relative-links (0.6.0)
  * jekyll-remote-theme (0.3.1)
  * jekyll-sass-converter (1.5.2)
  * jekyll-seo-tag (2.5.0)
  * jekyll-sitemap (1.2.0)
  * jekyll-swiss (0.4.0)
  * jekyll-theme-architect (0.1.1)
  * jekyll-theme-cayman (0.1.1)
  * jekyll-theme-dinky (0.1.1)
  * jekyll-theme-hacker (0.1.1)
  * jekyll-theme-leap-day (0.1.1)
  * jekyll-theme-merlot (0.1.1)
  * jekyll-theme-midnight (0.1.1)
  * jekyll-theme-minimal (0.1.1)
  * jekyll-theme-modernist (0.1.1)
  * jekyll-theme-primer (0.5.3)
  * jekyll-theme-slate (0.1.1)
  * jekyll-theme-tactile (0.1.1)
  * jekyll-theme-time-machine (0.1.1)
  * jekyll-titles-from-headings (0.5.1)
  * jekyll-watch (2.2.1)
  * jemoji (0.10.2)
  * kramdown (1.17.0)
  * liquid (4.0.0)
  * listen (3.1.5)
  * mercenary (0.3.6)
  * mini_portile2 (2.4.0)
  * minima (2.5.0)
  * minitest (5.11.3)
  * multipart-post (2.1.1)
  * nokogiri (1.10.3)
  * octokit (4.14.0)
  * pathutil (0.16.2)
  * public_suffix (3.1.1)
  * rb-fsevent (0.10.3)
  * rb-inotify (0.10.0)
  * rouge (2.2.1)
  * ruby-enum (0.7.2)
  * ruby_dep (1.5.0)
  * rubyzip (1.2.3)
  * safe_yaml (1.0.5)
  * sass (3.7.4)
  * sass-listen (4.0.0)
  * sawyer (0.8.2)
  * terminal-table (1.8.0)
  * thread_safe (0.3.6)
  * typhoeus (1.3.1)
  * tzinfo (1.2.5)
  * unicode-display_width (1.6.0)

但是它们不等于特殊值if '0': print("you will see this") if '': # for comparison print("you will not see this") # Alternately: bool('0') # True bool('') # False

没有矛盾。

答案 1 :(得分:2)

在检查是否相等之前,您必须考虑将操作数转换为通用类型的语言。这不是Python的工作方式。如您所读here,平等的规则非常复杂。但是归结为:

  

相等比较的默认行为(==和!=)基于对象的标识。

因此,所有非空字符串都是"interpreted as true"(大多数对象,空容器和几个常量除外);但是它们彼此不相等,并且它们不等于常数True

“解释为true”基本上意味着它们使条件满足,并且转换为布尔值(使用bool())将得到值True

PS。只是为了好玩,请注意以下确实存在

>>> print(1 == True)
True

是的,常量True恰好是equal to the integer 1。为什么不?

答案 2 :(得分:0)

如果您对此进行比较:

print('0'==False) # False
print("0"==False) # False

因此它们没有给出错误,您正在比较'0'是否等于True,这是错误的,但是如果您正在执行类似

if '0':
   print("true") # this will be printed

答案 3 :(得分:0)

'0'是一个字符串,不能为空。对于字符串,只有空字符串是虚假的,即''

In [239]: bool('0')                                                                  
Out[239]: True

In [240]: bool('')                                                            
Out[240]: False

对于真假测试,您可以执行以下操作:

if <some_value>:

无需检查其他任何值。这适用于所有类型。