diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 17355b41563cb..7cb43c49ab388 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -5023,8 +5023,9 @@ def array(self) -> ExtensionArray: from pandas.core.arrays.numpy_ import NumpyExtensionArray array = NumpyExtensionArray(array) - array = array.view() - array._readonly = True + # TODO decide on read-only https://github.com/pandas-dev/pandas/issues/63099 + # array = array.view() + # array._readonly = True return array @property diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index f0d4a76d8d34e..544a48a96b955 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -2387,7 +2387,9 @@ def external_values(values: ArrayLike) -> ArrayLike: values.flags.writeable = False else: # ExtensionArrays - values = values.view() - values._readonly = True + # TODO decide on read-only https://github.com/pandas-dev/pandas/issues/63099 + # values = values.view() + # values._readonly = True + pass return values diff --git a/pandas/core/series.py b/pandas/core/series.py index 8508069b7e251..09d630f78b776 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -821,8 +821,9 @@ def _references(self) -> BlockValuesRefs: @property def array(self) -> ExtensionArray: arr = self._mgr.array_values() - arr = arr.view() - arr._readonly = True + # TODO decide on read-only https://github.com/pandas-dev/pandas/issues/63099 + # arr = arr.view() + # arr._readonly = True return arr def __len__(self) -> int: diff --git a/pandas/tests/copy_view/test_array.py b/pandas/tests/copy_view/test_array.py index aed7afb8fb123..e6068f9713bfd 100644 --- a/pandas/tests/copy_view/test_array.py +++ b/pandas/tests/copy_view/test_array.py @@ -25,12 +25,21 @@ ], ids=["values", "array", "np.asarray", "np.array"], ) -def test_series_values(method): +def test_series_values(request, method): ser = Series([1, 2, 3], name="name") ser_orig = ser.copy() arr = method(ser) + if request.node.callspec.id == "array": + # https://github.com/pandas-dev/pandas/issues/63099 + # .array for now does not return a read-only view + assert arr.flags.writeable is True + # updating the array updates the series + arr[0] = 0 + assert ser.iloc[0] == 0 + return + # .values still gives a view but is read-only assert np.shares_memory(arr, get_array(ser, "name")) assert arr.flags.writeable is False @@ -109,20 +118,42 @@ def test_series_to_numpy(): @pytest.mark.parametrize( "method", [ + lambda ser: np.asarray(ser.values), lambda ser: np.asarray(ser.array), lambda ser: np.asarray(ser), lambda ser: np.asarray(ser, dtype="int64"), lambda ser: np.array(ser, copy=False), ], - ids=["array", "np.asarray", "np.asarray-dtype", "np.array"], + ids=["values", "array", "np.asarray", "np.asarray-dtype", "np.array"], ) -def test_series_values_ea_dtypes(method): +def test_series_values_ea_dtypes(request, method): ser = Series([1, 2, 3], dtype="Int64") + ser_orig = ser.copy() + arr = method(ser) + if request.node.callspec.id in ("values", "array"): + # https://github.com/pandas-dev/pandas/issues/63099 + # .array/values for now does not return a read-only view + assert arr.flags.writeable is True + # updating the array updates the series + arr[0] = 0 + assert ser.iloc[0] == 0 + return + + # conversion to ndarray gives a view but is read-only assert np.shares_memory(arr, get_array(ser)) assert arr.flags.writeable is False + # mutating series through arr therefore doesn't work + with pytest.raises(ValueError, match="read-only"): + arr[0] = 0 + tm.assert_series_equal(ser, ser_orig) + + # mutating the series itself still works + ser.iloc[0] = 0 + assert ser.values[0] == 0 + @pytest.mark.parametrize( "method",