这里是一个真正 NumPy 的新手问题。
我有一个名为“图像”的 numpy 数组。这样做:
image2 = image
image2[image < minval] = minval
image2[image > maxval] = maxval
...更改“图像”的内容。
我认为这是因为 Python 中的变量实际上是引用,所以“image2”只是引用“image”的另一种方式。所以我应该使用“image2 = np.copy(image)”。很好。
但是,为什么当我这样做时 'a' 没有改变:
a = 5
b = a
b = 7
“b”不就是指代“a”的另一种方式吗?如果是这样,为什么最后没有 a==7?
我想知道是否有某种心理模型可以使这看起来一致。因为它没有。
最佳答案
答案真的在于直接赋值的方式,比如b=a
和 b=7
工作。 b=a
创建对同样由 a
引用的对象的新引用, 并将该新引用与名称 b
相关联.后续b=7
然后删除附加到名称 b
的引用, 并与名称 b
建立不同的关联.这将是真实的a
是不可变类型(如整数)或可变类型(如 numpy 数组)。在这两种情况下,a
的内容都不会进行修改。
相比之下,image2[image < minval] = minval
不是重新分配。通过使用 []
它调用对象 __setitem__
的方法( image2
) .此方法更改了部分基础数据结构,而无需将任何内容重新分配给 image2
.
Python 最基本的类型是“不可变的”。这意味着您什么都无法更改它们(例如,如果 image2
是不可变类型 tuple
,尝试使用 []
索引更改其元素之一会导致异常有待提高)。
因此,非常非常松散,如果您习惯了 C/C++ 的思维方式,有时将不可变类型视为按值传递而可变类型则可能会有所帮助查看函数或方法原型(prototype)时的引用。但是,正如评论中所指出的那样,这并不是真正发生的事情:一切都是引用,但某些引用(不可变类型)会自动按照 C/C++ 处理 const
的方式进行处理。引用资料。
不可变类型包括:
- 基本数字类型:
bool
,int
,long
,float
和complex
- 基本字符串类型:
str
,unicode
(仅限 python 2.x)和bytes
(仅限 Python 3.x) -
tuple
(但不是list
)
关于python - 为什么我需要 np.array() 或 np.copy()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538174/