Pythonban dict típusú szótárt több módon is létrehozhatunk, amelyek közül egy lehetőség, ha a dict.fromkeys(iterobj, value) metódus hívásával tesszük ezt. Ez akkor hasznos, ha a szótár megalkotásával egyidőben a kulcsokhoz azonos kezdőértéket akarunk beállítani. A metódus első argumentuma egy olyan iterálható objektum, amelynek elemei a szótár kulcsai lesznek. A kulcsok mindegyikéhez egyetlen érték fog tartozni, amelyet a második argumentum szolgáltat. Lényeges tudni, hogy ez az érték közös lesz mindegyik kulcshoz. Másképpen fogalmazva, a kulcsok mindegyikéhez ugyanaz az objektum fog rendelődni. Ha ez nem tudatosul eléggé, akkor meglepő lehet a szótár viselkedése, ha a közös értékobjektum változtatható, mint például egy lista vagy egy halmaz.
Ugyanis, ha bármelyik kulccsal kikérjük ezt a közös objektumot, és változtatunk az értékén, akkor azt tapasztaljuk, hogy a változtatás minden kulcs-érték párra érvényes lesz. Ezt szemléltetik az alább látható kódsorok.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
d = dict.fromkeys('abc',set()) print(d) # Eredmény: {'a': set(), 'b': set(), 'c': set()} d['a'].add(123) print(d) # Eredmény: {'a': {123}, 'b': {123}, 'c': {123}} # Szótárlétrehozás független közös változtatható értékobjektummal. dd = {k:set() for k in 'abc'} print(dd) # Eredmény: {'a': set(), 'b': set(), 'c': set()} dd['a'].add(123) print(dd) # Eredmény: {'a': {123}, 'b': {}, 'c': {}} |
Ha ezt el akarjuk kerülni, akkor a dict.fromkeys() hívásakor második argumentumnak nem változtatható objektumot kell adni.
Amennyiben mégis olyan szótárt szeretnénk létrehozni, amelynél a kulcsokhoz egymástól független változtatható objektumok tartoznak, akkor a példányosítást más módon kell megvalósítani, legegyszerűbben egy szótárépítő kifejezéssel, amit szintén láthatunk fentebb.