命名与内置函数冲突

时间:2013-05-13 13:51:59

标签: python list built-in

我犯了如下错误:

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

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

如果不重新启动Python shell,如何使用list作为内置函数而不是变量?

7 个答案:

答案 0 :(得分:30)

第一步:将列表重新绑定为其他名称

lst = list

第二步:删除list变量

del list

第三步不要再做


我比__builtins__.list更喜欢这个,因为它可以保存输入内容,而且你还没有留下名为list的变量。但是,最好完全避免这个问题。在编写生产代码时,请始终记住 not ,以使变量的名称与内置函数相同。

答案 1 :(得分:28)

使用__builtins__.list__builtins__['__list__'](取决于具体情况),或者只是再次删除listdel list)。

不需要进口:

>>> __builtins__.list
<type 'list'>

__builtins__的存在是一个CPython实现细节;在__main__模块中,它是一个模块,在其他任何地方它都是模块__dict__字典。 Jython,IronPython和PyPy可能会选择不提供此功能。使用__builtin__ module用于这些平台,或用于兼容Python 3的实现builtins module

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

答案 2 :(得分:8)

不要使用内置函数或类型作为变量名。就这么简单,语言不是那个意思。这样做没有任何意义。

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


为什么你应该 永远影子内置有几个原因。下面是一些比较严重的问题:

  • 兼容性,代码不适用于其他模块。
  • 混乱,任何阅读你代码的人都不会理解发生了什么。
  • 情况,许多内置插件使用其他内置插件,更改一个可能会在代码的其他方面产生意外结果。

答案 3 :(得分:4)

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

list = type([])

答案 4 :(得分:2)

在py2x中使用__builtin__.list

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

请勿使用__builtins__.list

来自docs

  

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

for py3x:

>>> import builtins
>>> builtins.list
<class 'list'>

答案 5 :(得分: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]

答案 6 :(得分:0)

是的,其他人在上面说,不要使用内置名称作为变量名称。这适用于listdict

同样,正如其他人所说,您可以通过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'>