我遇到了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
答案 0 :(得分:10)
"函数的行为似乎已被修改,因为第二个arg用于指定应沿其执行求和的轴。"
你已基本回答了自己的问题!
说这个函数的行为已被修改在技术上是不正确的。 from numpy import *
导致"阴影"使用builtin sum
function的numpy 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
希望这会澄清你的想法:)