[python] Zradne +=, ktere pracuje in-place

Vladimir Macek macek na sandbox.cz
Čtvrtek Září 5 09:30:18 CEST 2013


Mutable objekt obsazen v immutable objektu.

Inspiruju se clankem http://www.py.cz/PastiJazykaPython, nebot tyto
dusledky jsem si plne neuvedomoval. :-/

    >>> t = ([],)
    >>> t[0] += [2, 3]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> t
    ([2, 3],)

    >>> t = ([],)
    >>> t[0].extend([2,3])
    >>> t
    ([2, 3],)


Funguje i v Pythonu 3.2.

Michani tridnich a instancnich atributu:

    >>> class Foo:
    ...    
    ...     bar = []
    ...     def __init__(self, x):
    ...         self.bar = self.bar + [x]
    ...    
    >>> f = Foo(42)
    >>> g = Foo(100)
    >>> f.bar
    [42]
    >>> g.bar
    [100]

    >>> class Foo:
    ...     bar = []
    ...     def __init__(self, x):
    ...             self.bar += [x]
    ...            
    >>> f = Foo(42)
    >>> g = Foo(100)
    >>> f.bar
    [42, 100]
    >>> g.bar
    [42, 100]


Bacha.

BTW, jo a doporucuju v tom clanku precist vysvetleni, proc se zdanlive
nahodile objevuje tajemna UnboundLocalError, kdyz hrisne pouzivame
nelokalni promenne.

Neuvedomoval jsem si napriklad, ze Python jiz pri analyze kodu striktne
rozlisuje promenne na lokalni a nelokalni. Dulezity je pak tedy i kod,
ktery se ve funkci nachazi ZA radkem, ktery hazi chybu.

BTW2, spodni odkaz na Python Warts se zmenil:
http://web.archive.org/web/20031002184114/www.amk.ca/python/writing/warts.html

A jeste jsem nasel https://wiki.python.org/moin/PythonWarts

-- 
:  Vladimir Macek  :  http://macek.sandbox.cz  :  +420 608 978 164
:  UNIX && Dev || Training  :  Python, Django  :  GPG key 1F059424



Další informace o konferenci Python