Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与内置函数的命名冲突_Python_List_Built In - Fatal编程技术网

Python 与内置函数的命名冲突

Python 与内置函数的命名冲突,python,list,built-in,Python,List,Built In,我犯了如下错误: >>> list = ['a', 'b', 'c'] 但是现在我想使用内置函数list()。如您所见,listnamelist和内置函数list()之间存在命名冲突 如何在不重新启动Python shell的情况下将list用作内置函数而不是变量?在py2x中使用\uuuuuuuuuuuuuuuuuuuuuuu.list: >>> import __builtin__ >>> __builtin__.list <t

我犯了如下错误:

>>> list = ['a', 'b', 'c']
但是现在我想使用内置函数
list()
。如您所见,listname
list
和内置函数
list()
之间存在命名冲突


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

在py2x中使用
\uuuuuuuuuuuuuuuuuuuuuuu.list

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

使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

无需进口:

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

不要使用内置函数或类型作为变量名。就这么简单,语言并不是为了这个。这样做毫无意义

不仅如此,使用“list”这个名称作为列表是非常模糊的,我怀疑它在任何真正的代码中都是远程可用的


有几个原因可以说明为什么你不应该给一个内置的影子投下阴影。以下是一些更严重的问题:

  • 兼容性,代码将无法与其他模块一起工作
  • 混乱,任何阅读您的代码的人都不会理解发生了什么
  • 在这种情况下,许多内置程序使用其他内置程序,更改一个内置程序可能会在代码的其他方面产生意外的结果

它始终作为
\uuuuuu内置项\uuuuuuuu.列表提供

>>> __builtins__.list
<class 'list'>
>>> list = [1, 2, 3]
>>> __builtins__.list
<class 'list'>
第一步:将列表重新绑定到其他名称

lst = list
步骤二:删除
列表
变量

del list
第三步:不要再做了



我更喜欢这个而不是
\uuuuu内置的.list
,原因很简单,因为它保存了键入的内容,而且您还没有留下名为
list
的变量。然而,最好是完全避免这个问题。在编写生产代码时,请始终记住不要将变量命名为与内置函数相同的名称。

是的,上面有人说,不要将内置函数的名称用作变量名称。这适用于
列表
目录
,等等

同样,正如其他人所说,您可以通过
\uuuu内置\uuuuu.list
访问类型
列表。因此,如果您需要调用
列表
,您仍然可以找到它,只要您还没有反弹
\uuuuuu内置\uuuuuuu.list

重要的是,
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'>
>>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>名单
>>>列表=[1,2,3]
>>>名单
[1, 2, 3]
>>>弗雷德=名单
>>>弗雷德
[1, 2, 3]
>>>列表=\uuuu内置\uuuuu.list
>>>名单

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

list = type([])

不需要导入
,好吧。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。不管怎样,这段代码都不能像写的那样工作;它需要
import\uuuuu builtin\uuuuuu
\uuuuu builtins\uuuuuuu.list
。好问题,每当人们使用内置名称时,我们都应该链接到这个链接。值得注意的是:您最好使用以下方法之一访问内置版本,并将
列表
名称重新绑定到它,以撤销错误<代码>列表=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。“仅仅因为你能,并不意味着你应该。”福格伯德说,鉴于OP给出的情况——口译员犯了一个错误,我认为这样做没有什么错。显然,在任何写在文件中的代码中,情况都不同。这是一个很好的答案。除了您提到的优点外,它不依赖于CPython实现细节!对不起,这在我的书里是个错误的答案-1.这肯定是一种可能性,但这与我认为的编码敏感性背道而驰。这导致您的代码到处都与其他Python脱节,任何查看代码段的人都会感到困惑,并且无法与其他模块很好地协同工作。换言之,这将不断中断,并且非常脆弱。@InbarRose中的问题特别适用于Python解释器外壳。在生产代码中使用这些答案中提供的任何黑客都是疯狂的,我指的是在实时解释器之外编写的任何代码。
如果不重新启动Python shell,如何将list用作内置函数而不是list变量?
@InbarRose-这可能是在shell中键入的最简单方法,还记得先提到将现有变量重新绑定到其他变量。。。(不仅仅是把
列表
拿回来)@InbarRose你似乎没有考虑到问题的背景。不要使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
:这并不能回答问题-OP,但是他正在使用shell并希望修复错误。那么,当您覆盖
类型时,您会怎么做?因为这正是我的情况:我有一个带有
type
属性的类,我需要解决
\uuuu init\uuuu
中的歧义,同时仍然允许调用方调用,例如
事务(type=Transaction.T\u SINGLE)
。我不能使用不同的名称,如
\u type
,因为我正在实现一个API,
type
,作为
\uuuuuu init\uuuu
的函数参数,是面向用户的。您可能认为删除函数中的
类型
会像在全局范围中一样有效,但它会导致python在一个表面上错误的
UnboundLocalError
上崩溃。因此,我最后做的是在名为
\u typeof
的类中进行“备份”。我使用了名称
\u typeof
,因此很明显,其目的是类型检查(alajavascript);联合国
del list
>>> __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'>
list = type([])