导入numpy后,Python sum()有不同的结果

时间:2016-09-17 22:49:37

标签: python numpy sum

我遇到了Jake VanderPlas的这个问题,我不确定在导入numpy模块后我对结果差异的理解是完全正确的。

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

似乎在第一种情况下,sum函数计算可迭代的总和,然后从总和中减去第二个args值。

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

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

2 个答案:

答案 0 :(得分:10)

"函数的行为似乎已被修改,因为第二个arg用于指定应沿其执行求和的轴。"

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

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

答案 1 :(得分:6)

只将我的5个迂腐硬币添加到@Warren Weckesser回答。实际上from numpy import * 不会覆盖 builtins sum函数,只会阴影 __builtins__.sum,因为{{1} }语句将导入模块中定义的所有名称(除了以下划线开头的名称)绑定到当前的from ... import *命名空间。根据Python的名称解析规则(unofficialy LEGB规则),在global命名空间之前查找global命名空间。因此,如果Python找到了所需的名称,在您的情况__builtins__中,它会返回绑定的对象并且不会进一步查看。

修改: 为了告诉你发生了什么:

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 不删除对象,它是垃圾收集器的任务,它只是&#34; dereference&#34;当前命名空间中的名称绑定和删除名称。

第二个注释 :内置del函数的签名为sum

  

从左到右汇总sum(iterable[, start])start项,并返回总数。 iterable默认为start。迭代的项目通常是数字,起始值不允许是字符串。

我的情况0内置print(sum(range(5),-1)求和以-1开头。所以从技术上讲,你的短语是可迭代的总和,然后从和中减去第二个args值是不正确的。对于数字来说,稍后添加/减去并不重要。但是对于列表它(愚蠢的例子只是为了表明想法):

sum

希望这会澄清你的想法:)