我犯了如下错误:
>>> list = ['a', 'b', 'c']
但现在我想使用内置函数list()
。如您所见,listnamelist
和内置函数之间存在命名冲突list()
。
如何list
在不重新启动 Python shell 的情况下将其用作内置函数而不是变量?
第一步:将列表重新绑定到不同的名称
lst = list
第二步:删除list
变量
del list
第三步:不要再做
我更喜欢这个__builtins__.list
只是因为它节省了打字,而且你仍然没有留下一个名为list
. 但是,最好完全避免这个问题。编写生产代码时,请始终记住不要将变量命名为与内置函数相同的名称。
使用__builtins__.list
或__builtins__['__list__']
(取决于上下文),或简单地list
再次删除(del list
)。
无需进口:
>>> __builtins__.list
<type 'list'>
存在的__builtins__
是一个 CPython 实现细节;在__main__
模块中它是一个模块,在其他任何地方它都是模块__dict__
字典。Jython、IronPython 和 PyPy 可能会选择根本不提供此功能。将__builtin__
模块用于这些平台,或者对于 Python 3 兼容的实现,builtins
模块:
>>> import __builtin__
>>> __builtin__.list
<type 'list'>
不要使用内置函数或类型作为变量名。就这么简单,语言不是为此而生的。这样做是没有意义的。
不仅如此 - 使用名称“列表”作为列表是非常模棱两可的,我怀疑它甚至可以在任何实际代码中远程使用。
有几个原因可以解释为什么你永远不 应该隐藏一个内置的。一些更严重的情况如下:
要修复错误,还有另一种选择——如果我们记得内置的“函数”list()
实际上是一个类,那么我们可以这样做:
list = type([])
__builtin__.list
在 py2x 中使用:
>>> import __builtin__
>>> __builtin__.list
<type 'list'>
不要使用__builtins__.list
:
从文档:
CPython 实现细节:用户不应触碰
__builtins__
;这严格来说是一个实现细节。想要覆盖builtins
命名空间中的值的用户应该导入__builtin__
(no 's')模块并适当地修改其属性。
对于 py3x:
>>> import builtins
>>> builtins.list
<class 'list'>
它始终可用__builtins__.list
:
>>> __builtins__.list
<class 'list'>
>>> list = [1, 2, 3]
>>> __builtins__.list
<class 'list'>
但是,如果您碰巧重新绑定了它,那么您将别无选择。
您也可以使用该模块__builtin__
(或者builtins
,在 Python 3 中,不带下划线),但您必须导入它。但是这些是拼写相同事物的不同方式,而不是作为额外的选项 - 修改一个会影响两者:
>>> import builtins
>>> builtins.list
<class 'list'>
>>> builtins.list = [1, 2, 3]
>>> builtins.list
[1, 2, 3]
>>> __builtins__.list
[1, 2, 3]
是的,其他人在上面说,不要使用内置的名称作为变量名。这适用于list
,dict
等。
同样,正如其他人所说,您可以list
通过__builtins__.list
. 所以如果你需要调用list
,你仍然可以找到它,只要你没有反弹__builtins__.list
。
重要的是,虽然,list
是一个名字。您已将其重新绑定到列表的一个实例。如果你想再次list
表示<type 'list'>
,只需重新绑定一次。在 Python 2.7 中:
>>> __builtins__.list
<type 'list'>
>>> list
<type 'list'>
>>> list = [1, 2, 3]
>>> list
[1, 2, 3]
>>> fred = list
>>> fred
[1, 2, 3]
>>> list = __builtins__.list
>>> list
<type 'list'>