4 ms·
This isn't doing what you think though. There are container objects underneath. For instance "(a, b)" is "a tuple object containing two things, the values nam
by makecheck 9y ago
This isn't doing what you think though. There are container objects underneath.
For instance "(a, b)" is "a tuple object containing two things, the values named "a" and "b" so you can still refer to them separately. "[a, b]" is a new list with those same elements, not an alias for "(a, b)".
- masklinn 9y agoThe oddity is that unpacking an empty iterable works when the target is a "list", but not when it's a "tuple". In fact it so doesn't work it actually fails during parsing. And there are no collections underneath the LHS, it compiles to an UNPACK_SEQUENCE opcode in both cases: >>> @dis.dis ... def foo(): ... (a, b) = bar() ... 3 0 LOAD_GLOBAL 0 (bar) 3 CALL_FUNCTION 0 (0 positional, 0 keyword pair) 6 UNPACK_SEQUENCE 2 9 STORE_FAST 0 (a) 12 STORE_FAST 1 (b) 15 LOAD_CONST 0 (None) 18 RETURN_VALUE >>> @dis.dis ... def foo(): ... [a, b] = bar() ... 3 0 LOAD_GLOBAL 0 (bar) 3 CALL_FUNCTION 0 (0 positional, 0 keyword pair) 6 UNPACK_SEQUENCE 2 9 STORE_FAST 0 (a) 12 STORE_FAST 1 (b) 15 LOAD_CONST 0 (None) 18 RETURN_VALUE >>> @dis.dis ... def foo(): ... [] = bar() ... 3 0 LOAD_GLOBAL 0 (bar) 3 CALL_FUNCTION 0 (0 positional, 0 keyword pair) 6 UNPACK_SEQUENCE 0 9 LOAD_CONST 0 (None) 12 RETURN_VALUE
- makecheck 9y agoIt’s a good point that Python is smart enough not to build a mutable list on the right-hand side when not needed (e.g. for "x = [1, 2]" it will and for "y, z = [1, 2]" it will not). A right-hand tuple however is still a separate type, and if you disassemble the original cases you can see that "[] = []" is more wasteful than "[] = ()". >>> import dis >>> >>> @dis.dis ... def f(): ... a, b = 1, 2 ... (a, b) = [2, 3] ... (a,) = [4] ... a, = [5] ... [] = [] ... [] = () ... 3 0 LOAD_CONST 6 ((1, 2)) 3 UNPACK_SEQUENCE 2 6 STORE_FAST 0 (a) 9 STORE_FAST 1 (b) 4 12 LOAD_CONST 2 (2) 15 LOAD_CONST 3 (3) 18 ROT_TWO 19 STORE_FAST 0 (a) 22 STORE_FAST 1 (b) 5 25 LOAD_CONST 4 (4) 28 STORE_FAST 0 (a) 6 31 LOAD_CONST 5 (5) 34 STORE_FAST 0 (a) 7 37 BUILD_LIST 0 40 UNPACK_SEQUENCE 0 8 43 LOAD_CONST 7 (()) 46 UNPACK_SEQUENCE 0 49 LOAD_CONST 0 (None) 52 RETURN_VALUE