【发布时间】:2021-06-07 14:43:22
【问题描述】:
我正在阅读this 问题,关于不可变 numpy 数组,并且在对其中一个答案的评论中,有人表明当使用 y = x[:] 而不是 y = x 时,给定的技巧不起作用。
>>> import numpy as np
>>> x = np.array([1])
>>> y = x
>>> x.flags.writeable = False
>>> y[0] = 5
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
y[0] = 5
ValueError: assignment destination is read-only
>>> del x, y
>>> x = np.array([1])
>>> y = x[:]
>>> x.flags.writeable = False
>>> y[0] = 5
>>> x
array([5])
(Python 3.7.2,numpy 1.16.2)
这两者之间有什么区别?为什么在这种特定情况下它们的行为如此不同?
编辑:this 没有回答我的问题,因为它只询问使用列表的情况,我想知道为什么 numpy ndarray 显示这种特殊行为,其中取决于复制修改数据的方法有时会,有时不会'不要引发错误。
【问题讨论】:
-
@Ch3steR 我不认为
x[:]是x的副本(它是基本切片,不应该),因为在第二个作业中修改y仍然会修改x。 -
@QuangHoang 你是对的。撤回了我的评论。
-
不过,
x[:]是x的视图,具有相同的数据但单独的元数据(包括.flag.writeable)。这就是为什么我们可以通过y写入x的内存。
标签: python numpy numpy-ndarray