Saturday, September 10, 2005

Groteskt

Kanskje dette er en kodesnutt fra ditt favorittspråk:

>>> class foo():
... def __init__(self, x=[]):
... self.y = x
...
>>> a = foo()
>>> a.y.append(1)
>>> b = foo()
>>> b.y
[1]

Da han viste det til meg første gangen syntes jeg det var en grotesk bug; hvordan kan en bug på et så sentralt stykke kode overleve helt til versjon 2.4.1? Nå som jeg vet det er en feature er jeg målløs.

Jeg iler til dokumentasjonen, og Lo and Behold, i Section 5.3.4 Calls, et godt stykke ned i teksten finner vi en parantes. Den er som følger:
(Default values are calculated, once, when the function is defined; thus, a mutable object such as a list or dictionary used as default value will be shared by all calls that don't specify an argument value for the corresponding slot; this should usually be avoided.)
Betraktet som en bagatell hvis rette plass i verden er i en parantes; noe som egentlig er unødvendig. For den uinnvidde. Med et vennlig råd på slutten; this should usually be avoided. Usually? Herregud!

Jeg håper ingen forventer at vi skal bruke våre seks millioner kroner den veien.

Link