<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abhishek Ganji</title>
    <description>The latest articles on DEV Community by Abhishek Ganji (@abhishekganji27).</description>
    <link>https://dev.to/abhishekganji27</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1122511%2Fec70ea6b-870e-489b-b950-e2ac91afa0a6.jpeg</url>
      <title>DEV Community: Abhishek Ganji</title>
      <link>https://dev.to/abhishekganji27</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhishekganji27"/>
    <language>en</language>
    <item>
      <title>Python Boolean Expression Evaluation Explained</title>
      <dc:creator>Abhishek Ganji</dc:creator>
      <pubDate>Sat, 16 May 2026 14:55:18 +0000</pubDate>
      <link>https://dev.to/abhishekganji27/python-boolean-expression-evaluation-explained-59oo</link>
      <guid>https://dev.to/abhishekganji27/python-boolean-expression-evaluation-explained-59oo</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR;&lt;/strong&gt; Boolean Expressions in Python return Python Objects and not True or False values. &lt;code&gt;and&lt;/code&gt; expressions return left-most &lt;code&gt;False&lt;/code&gt;-valued object or right-most &lt;code&gt;True&lt;/code&gt;-valued object. &lt;code&gt;or&lt;/code&gt; expressions return left-most &lt;code&gt;True&lt;/code&gt;-valued object or right-most &lt;code&gt;False&lt;/code&gt;-valued object.&lt;/p&gt;

&lt;p&gt;Python has this unique behavior where it returns constituent objects when Boolean operators are used in an expression, instead of a True or False value. In this post, I have illustrated why Python does that. A little context before we dive in...&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Boolean Expression Syntax
&lt;/h3&gt;

&lt;p&gt;Boolean operators in Python are &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt;. A typical Boolean expression looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X &amp;lt;operator&amp;gt; Y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where, the operands &lt;code&gt;X&lt;/code&gt; and &lt;code&gt;Y&lt;/code&gt; are two Python objects and &lt;code&gt;&amp;lt;operator&amp;gt;&lt;/code&gt; is either &lt;code&gt;and&lt;/code&gt; or &lt;code&gt;or&lt;/code&gt;. A few examples of Boolean expressions are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="bp"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="bp"&gt;False&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;first&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;John&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;second&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Doe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hack&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hack&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;win&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Boolean Expression Evaluation
&lt;/h3&gt;

&lt;p&gt;Generally, a Boolean expression containing the &lt;code&gt;and&lt;/code&gt; operator evaluates to &lt;code&gt;True&lt;/code&gt; only if both the operands are &lt;code&gt;True&lt;/code&gt;, and evaluates to &lt;code&gt;False&lt;/code&gt; otherwise. Whereas, a Boolean expression containing the &lt;code&gt;or&lt;/code&gt; operator evaluates to &lt;code&gt;False&lt;/code&gt; only if both the operands are &lt;code&gt;False&lt;/code&gt;, and evaluates to &lt;code&gt;True&lt;/code&gt; otherwise.&lt;br&gt;
Truth Tables of &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; Boolean Operators are as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvvwwdi9q3ksox3imxv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvvwwdi9q3ksox3imxv7.png" alt="Truth Tables of AND and OR Boolean Operators" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;And now, we dive in...&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Boolean Expressions In Python
&lt;/h3&gt;

&lt;p&gt;Every object in python has an inherent True or False value. All non-zero and non-empty objects are evaluated as &lt;code&gt;True&lt;/code&gt;. For example, &lt;code&gt;10&lt;/code&gt;, &lt;code&gt;'abc'&lt;/code&gt;, &lt;code&gt;[1,2,3,4]&lt;/code&gt;, &lt;code&gt;(1, 'xyz', False)&lt;/code&gt;, &lt;code&gt;{'name': 'John', 'age': 34}&lt;/code&gt;. The number zero i.e. &lt;code&gt;0&lt;/code&gt; and empty objects such as &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt; and more are evaluated as &lt;code&gt;False&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;In Python, when a Boolean expression is evaluated, it does not return &lt;code&gt;True&lt;/code&gt; or &lt;code&gt;False&lt;/code&gt; value. Instead, it returns either &lt;code&gt;X&lt;/code&gt; or &lt;code&gt;Y&lt;/code&gt; i.e. a Python object. The object is returned based on two parameters: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The inherent value of the objects (&lt;code&gt;True&lt;/code&gt;/&lt;code&gt;False&lt;/code&gt;). &lt;/li&gt;
&lt;li&gt;The operator used (&lt;code&gt;and&lt;/code&gt;/&lt;code&gt;or&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  4. Boolean Expressions Containing &lt;code&gt;and&lt;/code&gt; Operator
&lt;/h3&gt;

&lt;p&gt;For expressions containing the &lt;code&gt;and&lt;/code&gt; operator, if atleast one object in the expression has an inherent value of &lt;code&gt;False&lt;/code&gt;, then the expression returns the first such object that is encountered. The expression will always evaluate to &lt;code&gt;False&lt;/code&gt; because False &lt;code&gt;and&lt;/code&gt; anything is always False. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mygmjhnenmjjd953jlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mygmjhnenmjjd953jlp.png" alt="Boolean expression with AND operator and atleast one false object" width="586" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In examples 2 and 3, the final result can be determined by evaluating just the first few objects. The rest of the objects are skipped and the result of the expression is returned. This is called &lt;strong&gt;&lt;em&gt;Short-Circuit Evaluation&lt;/em&gt;&lt;/strong&gt;. The evaluation takes a shortcut to the end because the final result could be determined before reaching the end. &lt;/p&gt;

&lt;p&gt;If the expression contains only &lt;code&gt;True&lt;/code&gt;-valued objects, the last such object is returned by the expression. Python evaluates all the operands from left to right in search of a &lt;code&gt;False&lt;/code&gt; object and stops at the last operand. Python evaluates and returns the last object, whether true or false, since it determines the result of the expression. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt9zhppxtlpoognvjp8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt9zhppxtlpoognvjp8w.png" alt="Boolean expression with AND operator and only true objects" width="582" height="279"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Boolean Expressions Containing &lt;code&gt;or&lt;/code&gt; Operator
&lt;/h3&gt;

&lt;p&gt;For expressions containing the &lt;code&gt;or&lt;/code&gt; operator, if atleast one object in the expression has an inherent value of &lt;code&gt;True&lt;/code&gt;, then the expression returns the first such object that is encountered. The expression will always evaluate to &lt;code&gt;True&lt;/code&gt; because True &lt;code&gt;or&lt;/code&gt; anything is always True. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsf4o1os8jfrko6kx50q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsf4o1os8jfrko6kx50q.png" alt="Boolean expression with OR operator and atleast one True object" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Short-Circuit Evaluation&lt;/em&gt;&lt;/strong&gt; can be observed in examples 1 and 2.  &lt;/p&gt;

&lt;p&gt;If the expression contains only &lt;code&gt;False&lt;/code&gt;-valued objects, the last such object is returned by the expression. Python evaluates all the operands from left to right in search of a &lt;code&gt;True&lt;/code&gt; object and stops at the last operand. Python evaluates and returns the last object, whether true or false, since it determines the result of the expression.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxd2at3t7nf641d88a0qe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxd2at3t7nf641d88a0qe.png" alt="Boolean expression with OR operator and only false objects" width="526" height="247"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Practical Use-Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Initialize a variable.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where, &lt;code&gt;a&lt;/code&gt; is the variable being initialized and &lt;code&gt;P&lt;/code&gt;, &lt;code&gt;Q&lt;/code&gt;, &lt;code&gt;R&lt;/code&gt; and &lt;code&gt;None&lt;/code&gt; are Python objects. Variable &lt;code&gt;a&lt;/code&gt; would be initialized to &lt;code&gt;None&lt;/code&gt; only if &lt;code&gt;P&lt;/code&gt;, &lt;code&gt;Q&lt;/code&gt;, and &lt;code&gt;R&lt;/code&gt; are zero or empty objects. &lt;code&gt;None&lt;/code&gt; can be replaced with a default, non-empty object.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filter non-zero and non-empty objects 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc2ds2koooqy60yopn3tn.png" alt="Filter non-zero and non-empty objects" width="800" height="134"&gt; 
Filtering out of zero and empty objects is also possible with a slight change in code. 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F466fcrgxrp96psl8b2df.png" alt="Filtering out of zero and empty objects" width="748" height="198"&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thank you for reading!! Comment your thoughts...&lt;/p&gt;

</description>
      <category>python</category>
      <category>boolean</category>
      <category>datastructures</category>
    </item>
  </channel>
</rss>
