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

aam*_*r23 4 python numpy sum

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

>>print(sum(range(5),-1)
>> 9
>> from numpy import *
>> print(sum(range(5),-1))
>> 10
Run Code Online (Sandbox Code Playgroud)

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

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

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

War*_*ser 10

"函数的行为似乎已经修改,因为第二个arg用于指定应该执行求和的轴."

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

说功能的行为已经被修改在技​​术上是不正确的. from numpy import *导致使用numpy 函数 "隐藏" 内置sum函数,因此当您使用该名称时,Python会找到numpy版本而不是内置版本(有关更多详细信息,请参阅@ godaygo的答案).这些是不同的函数,具有不同的参数.出于这个原因,使用它通常是一个坏主意.相反,使用,然后在需要numpy函数时使用,并在需要Python内置函数时使用.sumsumfrom somelib import *import numpy as npnp.sumsum


god*_*ygo 6

只有将我的5个迂腐硬币添加到@Warren Weckesser回答.实际上from numpy import * 不会覆盖builtins sum函数,它只是阴影 __builtins__.sum,因为from ... import *语句将导入模块中定义的所有名称(除了以下划线开头的名称)绑定到当前global名称空间.根据Python的名称解析规则(非本地LEGB规则),在global命名空间之前查找__builtins__命名空间.因此,如果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
Run Code Online (Sandbox Code Playgroud)

首先注意:del不删除对象,它是垃圾收集器的任务,它只是"取消引用"名称绑定并从当前命名空间中删除名称.

第二点:内置sum函数的签名是sum(iterable[, start]):

资金start和一个项目iterable从左到右,并返回总.start默认为0.iterable的项通常是数字,并且不允许起始值是字符串.

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

 In[1]: sum([[1], [2], [3]], [4])
Out[1]: [4, 1, 2, 3]               # not [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

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