18

我犯了如下错误:

>>> list = ['a', 'b', 'c']

但现在我想使用内置函数list()。如您所见,listnamelist和内置函数之间存在命名冲突list()

如何list在不重新启动 Python shell 的情况下将其用作内置函数而不是变量?

4

7 回答 7

32

第一步:将列表重新绑定到不同的名称

lst = list

第二步:删除list变量

del list

第三步不要再做


我更喜欢这个__builtins__.list只是因为它节省了打字,而且你仍然没有留下一个名为list. 但是,最好完全避免这个问题。编写生产代码时,请始终记住不要将变量命名为与内置函数相同的名称。

于 2013-05-13T14:01:49.810 回答
30

使用__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'>
于 2013-05-13T13:53:23.600 回答
9

不要使用内置函数或类型作为变量名。就这么简单,语言不是为此而生的。这样做是没有意义的。

不仅如此 - 使用名称“列表”作为列表是非常模棱两可的,我怀疑它甚至可以在任何实际代码中远程使用。


有几个原因可以解释为什么你永远 应该隐藏一个内置的。一些更严重的情况如下:

  • 兼容性,代码不能与其他模块一起使用。
  • 混乱,任何阅读您的代码的人都不会理解发生了什么。
  • 在某些情况下,许多内置程序使用其他内置程序,更改一个可能会对代码的其他方面产生意想不到的结果。
于 2013-05-13T13:53:49.377 回答
4

要修复错误,还有另一种选择——如果我们记得内置的“函数”list()实际上是一个类,那么我们可以这样做:

list = type([])
于 2013-07-21T10:15:38.180 回答
2

__builtin__.list在 py2x 中使用:

>>> import __builtin__ 
>>> __builtin__.list
<type 'list'>

不要使用__builtins__.list

文档

CPython 实现细节:用户不应触碰__builtins__;这严格来说是一个实现细节。想要覆盖builtins命名空间中的值的用户应该导入__builtin__(no 's')模块并适当地修改其属性。

对于 py3x:

>>> import builtins
>>> builtins.list
<class 'list'>
于 2013-05-13T13:53:05.230 回答
1

它始终可用__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]
于 2013-05-13T13:53:53.627 回答
0

是的,其他人在上面说,不要使用内置的名称作为变量名。这适用于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'>
于 2013-05-13T14:09:13.997 回答