title: string object behavior in python
body: <p>curious to know the reason for following</p>
  
  <pre><code>x='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 
  y='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
  x is y
  #output : True
  </code></pre>
  
  <pre><code>x='a'*21 
  y='a'*21
  x is y
  #output : False
  </code></pre>
  
  <p>Q1: since string interning is done for string literals then why not for 'a'*21 ? is it not a string literal?
  Q2: is it because expression 'a'*21 is evaluated at run-time and interning is done at runtime?</p>
  
  #
  
  <pre><code>s1 = "strin"
  s2 = "string"
  s1+"g" is s2
  
  # output : False 
  # Explaination : Above code involves a run-time concatenation, the result of which is not automatically interned
  
  Q3: How to know if an expression is going to be evaluated at run-time or compile time? 
  
  </code></pre>