只能加我5迂腐硬币到@Warren Weckesser回答。真的from numpy import *
不会覆盖的builtins
sum
功能,它只阴影__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])
:
的款项start
和iterable
的由左到右,并返回总的项目。 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]
希望这能阐明你的思想:)
究竟什么是你的问题? – Malvolio
...这就是为什么你永远不要导入* – YXD
练习的要点是'np.sum'与内建的'sum'不同 - 所以如果你不小心的话''''可能会很危险。 – hpaulj