Python中的对象已更改

时间:2014-09-25 08:53:19

标签: python arrays function numpy methods

我是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)时为什么会得到回溯?

2 个答案:

答案 0 :(得分:1)

  1. 阅读文档或尝试:)

  2. a.reshape()是对象a的方法,对于a.fill()是相同的。它可以做任何事情。这不适用于重塑(不是a.reshape) - 这是您从from numpy import *中的numpy nodule导入的函数。

  3. 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