我通过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
只有将我的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)
希望这会澄清你的想法:)