Looking at the BoundField code, it appears that the BoundField value is the initial value (the 0 int in your case) if the form is not bound, or the value from POST data (which is always a string) when form is bound.
So the comparison with integers (from the choices) works when form is not bound, but cannot work on a bound form.
If you want the comparison to work in all cases, you have to convert values (from choices and bound field value) to str before doing comparison. E.g.
{% if scope_id|stringformat:"s" == search_form.scope.value|stringformat:"s" %}
It does not seem very straight forward, but I think this is the way BoundFields work.
Using TypedChoiceField does not help here, even if I think this is still relevant to retrieve the correct type for scope in your view after form validation.