[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Shared references



Egbert Bouwman wrote:
> 
> On Tue, Dec 14, 1999 at 03:09:33PM +0100, Martijn Faassen wrote:
> >
> > Wat maakt references eigenlijk moeilijk voor jou? is mijn vraag terug.
> >
> Het is in ieder geval onwennig. En ik vind het ook niet zo natuurlijk.
> In mijn probeersel had ik staan:   [[0]*3]*2
> Daarin verwacht je niet dat die nullen iets met elkaar te maken hebben.

Da's waar, hoewel bij mij dit soort code dan ook zelde voorkomt; ik doe
niet vaak aan het vermenigvuldigen van lijsten. Ik denk dat het dus in
de praktijk wel meevalt, hoewel het kan zijn dat jouw
programmeertechnieken hierin anders zijn.

> Nu moet ik mijn toevlucht zoeken bij trucs ( de [:] slice, of deepcopy)
> om de gewenste onafhankelijkheid te bereiken.

Ik denk dat het idee is dat dit soort moeilijkheden kleiner zijn en
minder vaak voorkomen dan de moeilijkheden (bijv. performance,
duplicatie van objecten, en het de hele tijd met de hand moeten
references) die je krijgt met standaard copy-semantics. Of nog erger, de
verwarring die kan ontstaan bij gemengde semantiek, zoals bijv. in
Delphi; object variabelen zijn daar references, maar al het andere gaat
by value. 

> In mijn python-boek wordt een paar keer voor dit verschijnsel gewaarschuwd,
> ik dacht dat ik het begrepen en verwerkt had, en toch tuin ik er de eerste
> keer al in. Is dat nu helemaal alleen mijn fout ?

Nee hoor, er zijn wat subtiele dingen die hiermee te maken hebben.
'default arguments' zijn een beetje tricky bijvoorbeeld als je er een
mutable object in stopt:

def foo(default=[]):
    default.append(1)
    return default

print foo()
uitvoer: [1]
print foo()
uitvoer: [1, 1]

Da's erg gek natuurlijk, en komt omdat 'default' naar hetzelfde object
blijft wijzen; de eerste keer is dat [] maar je hebt het in de function
body veranderd.
Als je het eenmaal weet is het niet moeilijk om te vermijden:

def foo(default=None):
    default = default or [] 
    return default

Dit zet default op de waarde van het argument, behalve als deze None is
(als er bijv. geen argument was), dan wordt ie op [] gezet.

> Gemak en natuurlijkheid gaan Van Rossum wel ter harte, dat is duidelijk.
> Voor het begrenzen van de afhankelijke statements via indentatie,
> zoals in het if-statement, verdient hij een Nobel-prijsje.
> Ik erger me al jaren aal de gangbare C en perl programmeer-stijl
> waarin indentatie en {} niet gelijkgehouden worden.

Het is gek hoeveel mensen zweren bij die {} stijl; de meesten ervan
hebben nog nooit Python's manier geprobeerd. Maar ze hechten aan de
'vrijheid' die je dan krijgt. Wat een vrijheid. :) Er zijn wel enkele
andere python gebruikers die het inspringen nog steeds niet leuk vinden
maar Python gebruiken omdat ze andere features fijn vinden. Bij mij
struikelden mijn ogen na een paar dagen al over de }'s in C++ code.

> Op een willekeurige pagina in Programming Perl zie ik staan:
> 
> sub saymaybe {
>    if (defined &say) {
>       say(@_);
>    }
>    else {
>       warn "Can't say";
>    }
> }
> 
> Om gek van te worden, de zwevende brace in space.

En dan dat gezooi om zelf de functie argumenten uit te vissen..

Groeten,

Martijn

Nederlandse Python mailinglist, python@nl.linux.org
archief: http://mail.nl.linux.org/python/