On Friday, July 10, 2015 at 8:04:36 AM UTC-4, candide wrote:
> Le vendredi 10 juillet 2015 04:02:56 UTC+2, Chris Angelico a écrit :
> 
> 
>  
> > I'm not sure what contradiction you're referring to, here. The
> > evaluation that you're pointing out says, as Terry showed via the
> > disassembly, that Python's first action is to look up the name 't' and
> > grab a reference to whatever object it points to. 
> 
> 
> But in order to perform an operation, the interpreter has to evaluate the 
> operands and "evaluating" is not "grabbing a reference to". 
> 
> > The execution of
> > t.sort() has to happen before the multiplication, because of the
> > parentheses.
> >
> 
> 
> 
> Official docs explains what evaluation is :
> 
> When the name is bound to an object, evaluation of the atom yields that 
> object.
> 
> So, since the Python interpreter is performing evaluation from left to right, 
> the first operand of the expression :
> 
> t*(1+int(bool(t.sort())))
> 
> evaluates to [2020, 42, 2015]. Next, the second operatand evaluates to the 
> integer 1. So I was expecting the result to be a shallow copy of the first 
> list [2020, 42, 2015] (the value of t before side effect produced by the sort 
> method). On the contrary, the final result takes into in account the side 
> effect and it is as if the first operand has been evaluated twice before 
> execution of the multiplication operation.

The first operand is t. Evaluating t does not make a copy of t, it is simply
a reference to t.  If t is later modified (by the sort method), the modified
data will be seen when t is used in the multiplication.

Python never implicitly copies lists (or any other data structure).  This
explains more about the mechanics of names and values: http://bit.ly/pynames1

--Ned.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to