2016-09-17 28 views
2

我遇到了Jake VanderPlas的这个问题,我不确定是否理解导入numpy模块后结果不同的原因是完全正确的。Python sum()在导入numpy后有不同的结果

>>print(sum(range(5),-1) 
>> 9 
>> from numpy import * 
>> print(sum(range(5),-1)) 
>> 10 

好像在第一场景中的总和函数计算在迭代的总和,然后减去从总和第二ARGS值。

在第二种情况下,在导入numpy后,函数的行为似乎已经修改,因为第二个arg用于指定执行总和的轴。

练习数(24) 源 - http://www.labri.fr/perso/nrougier/teaching/numpy.100/index.html

+1

究竟什么是你的问题? – Malvolio

+13

...这就是为什么你永远不要导入* – YXD

+0

练习的要点是'np.sum'与内建的'sum'不同 - 所以如果你不小心的话''''可能会很危险。 – hpaulj

回答

6

只能加我5迂腐硬币到@Warren Weckesser回答。真的from numpy import *不会覆盖builtinssum功能,它只阴影__builtins__.sum,因为from ... import *语句结合导入的模块中定义的所有名称,除了那些以下划线开始,到当前的global命名空间。并根据Python的名称解析规则(非官方LEGB规则),在__builtins__名称空间之前查找global名称空间。所以如果Python找到想要的名字,在你的例子sum中,它会返回绑定的对象,而且看起来不会更远。

编辑: 要告诉你这是怎么回事:

In[1]: print(sum, ' from ', sum.__module__) # here you see the standard `sum` function 
Out[1]: <built-in function sum> from builtins 

In[2]: from numpy import *      # from here it is shadowed 
     print(sum, ' from ', sum.__module__) 
Out[2]: <function sum at 0x00000229B30E2730> from numpy.core.fromnumeric 

In[3]: del sum         # here you restore things back 
     print(sum, ' from ', sum.__module__) 
Out[3]: <built-in function sum> from builtins 

首先要注意del不删除对象,它是垃圾收集器,它只是“解引用”的任务名称绑定和从当前命名空间删除名称。

第二个音符:内置sum功能签名sum(iterable[, start])

的款项startiterable的由左到右,并返回总的项目。 start默认为0。迭代的项目通常是数字,并且不允许开始值为字符串。

我的情况print(sum(range(5),-1) for built-in sum summation以-1开头。因此,在技术上,您的短语超过可迭代的总和,然后从总和减去第二个参数值是不正确的。对于数字加/减后面的数字确实无关紧要。但对于列表它(傻例子只是为了说明这个想法):

In[1]: sum([[1], [2], [3]], [4]) 
Out[1]: [4, 1, 2, 3]    # not [1, 2, 3, 4] 

希望这能阐明你的思想:)

+0

@WarrenWeckesser欢迎您。 – godaygo

10

“函数的行为似乎已经修改为第二ARG用于指定沿着应该执行的总和的轴线”。

你基本上回答了你自己的问题!

说这个函数的行为是修改为在技术上是不正确的。 from numpy import *导致“shadowing”builtin sum functionnumpy sum function,因此当您使用名称sum时,Python会找到numpy版本而不是内置版本(有关更多详细信息,请参阅@ godaygo的答案)。这些是不同的函数,具有不同的参数。正是出于这个原因,使用from somelib import *通常是一个糟糕的主意。相反,使用import numpy as np,然后在需要numpy函数时使用np.sum,而当您需要Python内建函数时使用普通sum

+0

雅这是我从这两个函数的文档中推断出来的,我认为它是某种函数重载,但是想要确定。感谢您的详细解释。 – aamir23