我是python和OOP概念的新手,我无法理解某些事情,比如为什么某些功能会改变原始对象而有些功能却没有。为了更好地理解它,我在下面的代码片段中的注释中引起了我的困惑。任何帮助表示赞赏。谢谢。
from numpy import *
a = array([[1,2,3],[4,5,6]],float)
print a
array([[ 1., 2., 3.],
[ 4., 5., 6.]]) ### Result reflected after using print a
a.reshape(3,2)
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]]) ### Result reflected on IDE after applying the reshape function
print a
array([[ 1., 2., 3.],
[ 4., 5., 6.]]) ### It remains the same as original value of "a", which is expected.
a.fill(0)
print a
[[ 0. 0. 0.]
[ 0. 0. 0.]] ### It changed the value of array "a" , why?
#############
type(reshape) ### If i try to find the type of "reshape" , i get an answer as "function" .
<type 'function'>
type(fill) ### I get a traceback when i try to find type of "fill", why?
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
type(fill)
NameError: name 'fill' is not defined
我的问题是:
1)我如何知道哪些功能(考虑“填充”是一个功能)将改变我的原始对象值(在我的情况下是“a”)?
2)考虑(如果我错了,纠正我)如果“填充”是一个函数那么,为什么它改变了对象“a”的原始值?
3)当我使用type(fill)时为什么会得到回溯?
答案 0 :(得分:1)
阅读文档或尝试:)
a.reshape()是对象a的方法,对于a.fill()是相同的。它可以做任何事情。这不适用于重塑(不是a.reshape) - 这是您从from numpy import *
中的numpy nodule导入的函数。
fill不在numpy模块中(您还没有导入它),它是ndarray
对象的成员。
答案 1 :(得分:1)
给定的函数可以改变输入对象。在NumPy中,许多函数都带有out
参数,该参数告诉函数将答案放在此对象中。
以下是带有out
参数的部分 NumPy函数:
这些函数可能会以ndarray
方法而不是 out
参数的形式提供,在这种情况下执行操作。也许最着名的是:
某些函数和方法不使用out
参数,只要可能就返回内存视图:
np.reshape()
和方法ndarray.reshape()
ndarray.fill()
是子程序的一个示例,它只作为方法提供,可以就地更改数组。
每当你得到一个ndarray对象或它的子类时,可以根据OWNDATA
属性的flags
条目检查它是否是一个内存视图:
print(a.flags)
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False