[Python-es] Posible problema con copias de diccionarios

Christian Pinedo Zamalloa chr.pinedo en gmail.com
Mie Sep 8 20:13:31 CEST 2010


Hola,

llevo más de 2 horas con un problema en Python que no consigo
solucionar y lo que es peor no consigo ver donde se encuentra el
problema. Explico el problema.

Dentro del bucle for, en una lista de diccionarios compruebo si está
un diccionario que tengan una key de nombre id con un valor
determinado. Si se encuentra se copia el diccionario y se elimina de
la lista. Posteriormente este diccionario es copiado a otro
diccionario y sobre este nuevo diccionario se aplican cambios. Pues
bien al aplicarse cambios en unas keys se pierden los valores de la
copia... Creo que puede ser un problema con la eliminación del
diccionario de la lista o las copias de diccionarios que hago.... pero
he intentado mil cosas y no he conseguido nada.

Pego el código y el resultado de las pruebas. Gracias!!

CODIGO
=======

 51     # comprobar si hay un id idéntico en la lista de llamadas
 52     for i in range(len(calls)):
 53         if calls[i]['id'] == id:
 54             if calls[i]['event'] == "ENTERQUEUE" or\
 55                calls[i]['event'] == "CONNECT":
 56                 print "DENTRO DEL BUCLE"
 57                 print "oldcall1"
 58                 for key in keys:
 59                     oldcall[key] = calls[i][key]
 60                 print oldcall
 61                 calls.pop(i)
 62                 break
 63             else:
 64                 print >> sys.stderr, "Error: Se va a sobreescribir
un evento\
 65                 no considerado en el script %s" % call['event']
 66                 sys.exit(1)
 67     if oldcall:
 68         print "oldcall2"
 69         print oldcall
 70         for key in keys:
 71             newcall[key] = oldcall[key]
 72         print "newcall1"
 73         print newcall
......
 81     elif event == "CONNECT":
 82         newcall['event'] = line.split('|')[4]
 83         newcall['agent'] = line.split('|')[3].split('@')[0].split('/')[1]
 84         newcall['waittime'] = line.split('|')[5]


DEBUG
=======

DENTRO DEL BUCLE
oldcall1
{'waittime': '', 'callerid': '', 'calltime': '', 'agent': '', 'event':
'ENTERQUEUE', 'queue': '17810', 'inposition': '', 'outposition': '',
'date': '1283941447', 'id': '1283941434.31503'}
oldcall2
{'waittime': '', 'callerid': '', 'calltime': '', 'agent': '', 'event':
'ENTERQUEUE', 'queue': '17810', 'inposition': '', 'outposition': '',
'date': '1283941447', 'id': '1283941434.31503'}
newcall1
{'waittime': '', 'callerid': '', 'calltime': '', 'agent': '', 'event':
'ENTERQUEUE', 'queue': '17810', 'inposition': '', 'outposition': '',
'date': '1283941447', 'id': '1283941434.31503'}
newcall2
{'waittime': '119', 'callerid': '', 'calltime': '', 'agent': '17816',
'event': 'CONNECT', 'queue': '', 'inposition': '', 'outposition': '',
'date': '', 'id': ''}


-- 
Christian Pinedo Zamalloa (zako)
PGP keyID: 0x828D0C80
Fingerprint: 7BFF 4105 F46B 7977 BD96  348C 1007 4FF8 828D 0C80


Más información sobre la lista de distribución Python-es