Oletusargumentin asettaminen Python-funktion määrittelyssä aiheuttaa sen, että oletusarvoa käytetään, jos argumentti jätetään pois funktiokutsun aikana.
Seuraavassa kuvataan seuraavat yksityiskohdat.
- Oletusargumenttien asettaminen
- Oletusargumenttien sijaintia koskevat rajoitukset
- Huomaa, että kun oletusarvona käytetään luetteloa tai sanakirjaa.
Oletusargumenttien asettaminen
Jos argumentin nimi = oletusarvo funktion määritelmässä, oletusarvoa käytetään, kun vastaava argumentti jätetään pois.
def func_default(arg1, arg2='default_x', arg3='default_y'): print(arg1) print(arg2) print(arg3) func_default('a') # a # default_x # default_y func_default('a', 'b') # a # b # default_y func_default('a', arg3='c') # a # default_x # c
Oletusargumenttien sijaintia koskevat rajoitukset
Oletusargumentin sijoittaminen ennen normaalia argumenttia (argumentti, jolle ei ole määritetty oletusarvoa) funktiota määritettäessä johtaa virheeseen.SyntaxError
# def func_default_error(arg2='default_a', arg3='default_b', arg1): # print(arg1) # print(arg2) # SyntaxError: non-default argument follows default argument
Huomaa, että kun oletusarvona käytetään luetteloa tai sanakirjaa.
Jos oletusarvoksi on määritetty päivitettävä (muuttuva) objekti, kuten lista tai sanakirja, kyseinen objekti luodaan, kun funktio määritellään. Kun funktiota sitten kutsutaan ilman vastaavaa argumenttia, käytetään samaa objektia.
Oletusargumenttien arvot arvioidaan vasemmalta oikealle, kun funktion määritelmä suoritetaan. Tämä tarkoittaa, että oletusargumentin lauseke arvioidaan vain kerran, kun funktio määritellään, ja samaa ”laskettua” arvoa käytetään jokaisessa kutsussa.
8.7. Function definitions — Python 3.10.2 Documentation
Jos esimerkiksi määritellään funktio, joka ottaa oletusargumentikseen listan tai sanakirjan ja lisää siihen elementtejä, ja sitä kutsutaan useita kertoja ilman tätä argumenttia, elementit lisätään samaan objektiin toistuvasti.
Esimerkki luettelosta.
def func_default_list(l=[0, 1, 2], v=3): l.append(v) print(l) func_default_list([0, 0, 0], 100) # [0, 0, 0, 100] func_default_list() # [0, 1, 2, 3] func_default_list() # [0, 1, 2, 3, 3] func_default_list() # [0, 1, 2, 3, 3, 3]
Esimerkki sanakirjasta.
def func_default_dict(d={'default': 0}, k='new', v=100): d[k] = v print(d) func_default_dict() # {'default': 0, 'new': 100} func_default_dict(k='new2', v=200) # {'default': 0, 'new': 100, 'new2': 200}
Uusi objekti luodaan aina, kun funktiota kutsutaan.
def func_default_list_none(l=None, v=3): if l is None: l = [0, 1, 2] l.append(v) print(l) func_default_list_none() # [0, 1, 2, 3] func_default_list_none() # [0, 1, 2, 3]