[ python-Bugs-1306777 ] Augmented assigment to mutable objects in tuples fail
SourceForge.net
noreply at sourceforge.net
Wed Sep 28 13:50:36 CEST 2005
Bugs item #1306777, was opened at 2005-09-28 11:59
Message generated for change (Comment added) made by mwh
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1306777&group_id=5470
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Interpreter Core
Group: Python 2.4
Status: Open
Resolution: None
Priority: 5
Submitted By: Mattias Engdegård (yorick)
Assigned to: Nobody/Anonymous (nobody)
Summary: Augmented assigment to mutable objects in tuples fail
Initial Comment:
>>> t=(set([2]),)
>>> t[0] |= set([7])
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object does not support item assignment
but the contained set is mutable, and in fact:
>>> t[0].__ior__(set([7]))
set([2, 7])
>>> t
(set([2, 7]),)
If I use a mutable container (a list) in the first
case, it works:
>>> u=[set([2])]
>>> u[0] |= set([7])
>>> u
[set([2, 7])]
But note that the list has not been mutated - only the
set, so there would be no need for a mutable container.
This is highly counter-intuitive - augmented assigment
should do in-place operations on mutable types (which
it does) and should therefore pose no restriction on
the mutability of the container (which fails).
----------------------------------------------------------------------
>Comment By: Michael Hudson (mwh)
Date: 2005-09-28 12:50
Message:
Logged In: YES
user_id=6656
Yuck, I agree that that's pretty icky. But the disassembly makes things
clear:
>>> dis.dis(compile('t[0] |= a', '', 'single'))
1 0 LOAD_NAME 0 (t)
3 LOAD_CONST 0 (0)
6 DUP_TOPX 2
9 BINARY_SUBSCR
10 LOAD_NAME 1 (a)
13 INPLACE_OR
14 ROT_THREE
15 STORE_SUBSCR
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
In fact...
>>> s = set([1])
>>> t = (s,)
>>> t[0] |= set([2])
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object does not support item assignment
>>> s
set([1, 2])
>>>
Oof.
Not sure what to do about this.
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1306777&group_id=5470
More information about the Python-bugs-list
mailing list