expression in an if statement
Daniel Kluev
dan.kluev at gmail.com
Thu Aug 19 00:29:20 EDT 2010
On Thu, Aug 19, 2010 at 9:12 AM, Thomas Jollans <thomas at jollybox.de> wrote:
> I doubt any actual Python implementation optimizes this -- how could it?
> The
> object "set" is clearly being called twice, and it happens to be called
> with
> the object "a" as a sole argument twice. What if "set" has side effects? A
> compiler could only exclude this possibility if it knew exactly what "set"
> will be at run time, which it can't.
>
> I expect that "set" and "a" have to be looked up twice, actually:
> "set(a).union(b)" might rebind either one of them. This would be considered
> a
> very rude and inappropriate thing to do, but Python usually guarantees to
> allow bad taste and behaviour.
>
>
Yep.
>>> def test():
... a = [1]
... b = [1]
... if set(a).union(b) == set(a): pass
...
>>> dis.dis(test)
2 0 LOAD_CONST 1 (1)
3 BUILD_LIST 1
6 STORE_FAST 0 (a)
3 9 LOAD_CONST 1 (1)
12 BUILD_LIST 1
15 STORE_FAST 1 (b)
4 18 LOAD_GLOBAL 0 (set)
21 LOAD_FAST 0 (a)
24 CALL_FUNCTION 1
27 LOAD_ATTR 1 (union)
30 LOAD_FAST 1 (b)
33 CALL_FUNCTION 1
36 LOAD_GLOBAL 0 (set)
39 LOAD_FAST 0 (a)
42 CALL_FUNCTION 1
45 COMPARE_OP 2 (==)
48 JUMP_IF_FALSE 4 (to 55)
51 POP_TOP
52 JUMP_FORWARD 1 (to 56)
>> 55 POP_TOP
>> 56 LOAD_CONST 0 (None)
59 RETURN_VALUE
> I might be wrong on some points here, but this is what I expect the
> expression
> (set(a).union(b) == set(a)) has to do, in any conforming implementation of
> Python. Please correct me if I'm wrong.
>
You can use dis module to let Python do compiling and explaining for you
--
With best regards,
Daniel Kluev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100819/1b4e0c8c/attachment-0001.html>
More information about the Python-list
mailing list