help on "from deen import *" vs. "import deen"
Ned Batchelder
ned at nedbatchelder.com
Sun Nov 20 07:54:09 EST 2016
On Sunday, November 20, 2016 at 6:47:35 AM UTC-5, Bev in TX wrote:
> From the Python 3.5.2 docs:
>
> 6.15. Evaluation order
> Python evaluates expressions from left to right. Notice that while
> evaluating an assignment, the right-hand side is evaluated before the
> left-hand side.
>
> Thus, spam = eggs = cheese = obj is equivalent to:
>
> spam = (eggs = (cheese = obj))
>
> which is also equivalent to:
>
> cheese = obj
> eggs = cheese
> spam = eggs
This is not right. Python will evaluate the right-hand side, and then
assign that value to all of the names, from left to right. So the end
result is equivalent to:
spam = obj
eggs = obj
cheese = obj
The reason the doc quote above doesn't apply here is that assignment
is not an expression, but a statement of its own, described in 6.2:
"An assignment statement evaluates the expression list (remember
that this can be a single expression or a comma-separated list,
the latter yielding a tuple) and assigns the single resulting object
to each of the target lists, from left to right."
You can see this by disassembling some examples:
>>> import dis
>>> def f():
... a = b = c = expr()
...
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (expr)
2 CALL_FUNCTION 0
4 DUP_TOP
6 STORE_FAST 0 (a)
8 DUP_TOP
10 STORE_FAST 1 (b)
12 STORE_FAST 2 (c)
14 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>> def g():
... d[a()] = d[b()] = d[c()] = expr()
...
>>> dis.dis(g)
2 0 LOAD_GLOBAL 0 (expr)
2 CALL_FUNCTION 0
4 DUP_TOP
6 LOAD_GLOBAL 1 (d)
8 LOAD_GLOBAL 2 (a)
10 CALL_FUNCTION 0
12 STORE_SUBSCR
14 DUP_TOP
16 LOAD_GLOBAL 1 (d)
18 LOAD_GLOBAL 3 (b)
20 CALL_FUNCTION 0
22 STORE_SUBSCR
24 LOAD_GLOBAL 1 (d)
26 LOAD_GLOBAL 4 (c)
28 CALL_FUNCTION 0
30 STORE_SUBSCR
32 LOAD_CONST 0 (None)
34 RETURN_VALUE
Of course, it hardly ever matters, because how often does anyone
use multiple assignment, and even rarer, where the targets are
computed, and even rarer, where the order of their assignment
matters?
--Ned.
More information about the Python-list
mailing list