diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 0f9938916b8df..1d70d27a900b1 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3286,6 +3286,11 @@ def intersection(self, other, sort: bool = False): result = self.unique()._get_reconciled_name_object(other) else: result = self._get_reconciled_name_object(other) + + # Always return a new instance on equality + if result is self: + result = self.copy() + if sort is True: result = result.sort_values() return result diff --git a/pandas/tests/indexes/base_class/test_setops.py b/pandas/tests/indexes/base_class/test_setops.py index d57df82b2358c..aa2f80d27ceea 100644 --- a/pandas/tests/indexes/base_class/test_setops.py +++ b/pandas/tests/indexes/base_class/test_setops.py @@ -264,3 +264,13 @@ def test_difference_object_type(self, diff_type, expected): result = getattr(idx1, diff_type)(idx2) expected = Index(expected) tm.assert_index_equal(result, expected) + def test_intersection_returns_new_instance(self): + idx1 = Index([0, 1]) + idx2 = Index([0, 1]) + result = idx1.intersection(idx2) + + # Should be equal but NOT the same reference + tm.assert_index_equal(result, idx1) + print(idx1) + assert result is not idx1 +