Я пытаюсь сделать что-то, что кажется очень простым и находится в пределах диапазона стандартного питона.Следующая функция принимает коллекцию наборов и возвращает все элементы, содержащиеся в двух или более наборах.
Для этого, пока коллекция наборов не пуста, она просто извлекает один набор изколлекция пересекает ее с остальными наборами и обновляет набор предметов, попадающих в одно из этих пересечений.
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
Выше я использую функцию.Чтобы проверить это, в CPython работает следующее:
>>> 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])
Однако, когда я пытаюсь использовать 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.
В названии, которое я сказал, это было таинственное исключение нулевого указателя,Я, вероятно, понятия не имею, как .NET обрабатывает нулевые указатели (я никогда не работал с C-подобным языком и использую IronPython только месяц или около того), но если мое понимание верно, это происходит, когда вы пытаетесьполучить доступ к некоторому свойству объекта, которое указывает на null
.
В этом случае ошибка возникает в строке 10 моей функции: in_two |= new
.Однако прямо перед этой строкой я поместил print
операторов, которые (по крайней мере для меня) указывают, что ни один из этих объектов не указывает на null
.
Куда я иду не так?