On 26/05/13 05:23, Mark Lawrence wrote:
On 25/05/2013 19:56, Jim Mooney wrote:
I thought tuples were immutable but it seems you can swap them, so I'm
confused:
a,b = 5,8
You've defined two names a and b so where's the tuple?
On the right hand side, 5,8 creates a tuple, which is then immediately unpacked
to two individual values. You can see this by disassembling the code. In 2.7,
you get this:
py> from dis import dis
py> code = compile("a, b = 5, 8", "", "exec")
py> dis(code)
1 0 LOAD_CONST 3 ((5, 8))
3 UNPACK_SEQUENCE 2
6 STORE_NAME 0 (a)
9 STORE_NAME 1 (b)
12 LOAD_CONST 2 (None)
15 RETURN_VALUE
Other versions may be slightly different, for example in Python 1.5 (ancient
history!) the constant tuple (5, 8) is not created at compile-time, but at
run-time:
# output of dis from Python 1.5:
0 SET_LINENO 0
3 SET_LINENO 1
6 LOAD_CONST 0 (5)
9 LOAD_CONST 1 (8)
12 BUILD_TUPLE 2
15 UNPACK_TUPLE 2
18 STORE_NAME 0 (a)
21 STORE_NAME 1 (b)
24 LOAD_CONST 2 (None)
27 RETURN_VALUE
But whenever it is created, the right hand side creates a tuple.
An interesting fact: on the left hand side, Python is very flexible with its
sequence unpacking syntax. All of these are equivalent, where RHS (Right Hand
Side) evaluates to exactly two items:
a, b = RHS
(a, b) = RHS
[a, b] = RHS
Note also that it is *sequence* unpacking, not *tuple* unpacking. Any sequence
will work. Actually, any iterable object will work, not just sequences. But the
name comes from way back in early Python days when it only worked on sequences.
--
Steven
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor