title: How is `*args` parsed by CPython?
body: <p>How does CPython, behind the scenes, evaluate expressions like</p>
  
  <pre><code>args = (2,3)
  print(*args) 
  </code></pre>
  
  <p>?</p>
  
  <p>The above obviously prints <code>2 3</code>, but what is CPython doing to make that appear? . Thus can I think of the <code>*</code> operator applied to iterables as a kind of macro, that CPython when running simply replaces with the iterable contents?</p>
  
  <p><strong>NOTE TO ALL WHO WOULD LIKE TO MARK MY QUESTION IMMEDIATELY AS DUPLICATE (AS HAPPENED IN THE PAST):</strong> This question is not addressed by <a href="https://stackoverflow.com/questions/36901/what-does-double-star-asterisk-and-star-asterisk-do-for-parameters">What does ** (double star/asterisk) and * (star/asterisk) do for parameters?</a><br>
  That question addresses how <code>*</code> behaves in all kinds of scenarios - I'm not interested in knowing that.<br>
  There there is also only a single mentioning of CPython (which doesn't address my concern).</p>
  
  <p>I want to know **internally* how CPython treats the code pasted above. Can I think of the <code>*</code> operator applied to iterables as a kind of macro, that CPython, when running, simply replaces with the iterable contents - or is CPython doing some more complex operation when parsing <code>*args</code> in the scenario above?</p>