我在考虑是否要检查字符串或字符的布尔值,是否要检查它们是否为空。但是以下代码给了我意外的输出。
print('0'==True)
print("0"==True)
输出:
False
False
发生了什么事?我们真正在检查什么?
答案 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>:
无需检查其他任何值。这适用于所有类型。