J'essaie de faire quelque chose qui semble très simple et qui relève de la norme Python. La fonction suivante prend une collection d'ensembles, et renvoie tous les éléments qui sont contenus dans deux ensembles ou plus.
Pour ce faire, tant que la collection d'ensembles n'est pas vide, il suffit de sortir un ensemble de la collection, de l'intersecter avec les ensembles restants et de mettre à jour un ensemble d'éléments qui se trouvent dans l'une de ces intersections.
def cross_intersections(sets):
in_two = set()
sets_copy = copy(sets)
while sets_copy:
comp = sets_copy.pop()
for each in sets_copy:
new = comp & each
print new, # Print statements to show that these references exist
print in_two
in_two |= new #This is where the error occurs in IronPython
return in_two
Ci-dessus, la fonction que j'utilise. Pour la tester, dans CPython, ce qui suit fonctionne :
>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> c = set([2,4,6,8])
>>> cross = cross_intersections([a,b,c])
set([2, 4]) set([])
set([4, 6]) set([2, 4])
set([3, 4]) set([2, 4, 6])
>>> cross
set([2, 3, 4, 6])
Cependant, lorsque j'essaie d'utiliser IronPython :
>>> b = cross_intersections([a,b,c])
set([2, 4]) set([])
set([4, 6]) set([2, 4])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:/path/to/code.py", line 10, in cross_intersections
SystemError: Object reference not set to an instance of an object.
Dans le titre, j'ai dit qu'il s'agissait d'une mystérieuse exception de pointeur nul. Je n'ai probablement aucune idée de la façon dont .NET gère les pointeurs nuls (je n'ai jamais travaillé avec un langage de type C et je n'utilise IronPython que depuis un mois environ), mais si je comprends bien, cela se produit lorsque vous tentez d'accéder à une propriété d'un objet qui pointe sur null
.
Dans ce cas, l'erreur se produit à la ligne 10 de ma fonction : in_two |= new
. Cependant, j'ai mis print
juste avant cette ligne qui (du moins pour moi) indique qu'aucun de ces objets ne pointe vers l'objet null
.
Où est-ce que je me trompe ?