为什么在Python中将变量命名为id
是不好的?
id()
是一个基本内部函数:
在模块
__builtin__
中,内置函数id
的帮助信息如下:通常,使用任何语言中关键字或内置函数名称相同的变量名都不是一个好主意,即使允许这样做。id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
object = []; np.array(object)
。 - wjandreasingle_trailing_underscore_
:按照惯例用于避免与Python关键字冲突,例如:Tkinter.Toplevel(master, class_='ClassName')
id_ = 42
包括在变量名中添加尾随下划线可以使意图清晰(对于熟悉PEP 8指南的人来说)。id
是内置函数而非关键字,并且这并没有解释为什么掩盖内置函数是不好的。 - wjandreaprint = 123
,但是在代码后面,你或者你的同事会惊讶于为什么print('Hello World')
会引发TypeError异常。PEP8提供了命名此类变量的推荐方式。 - Jeyekomonid
是一个内置函数,它提供了对象的标识符(在 CPython 中也是其内存地址)。如果你给自己的函数命名为 id
,那么你将不得不使用 builtins.id
来获取原始函数(或者在 CPython 中使用 __builtins__.id
)。在除了小型脚本之外的任何情况下,全局重命名 id
都会令人困惑。
然而,只要使用是局部的,重用内置名称作为变量并不是那么糟糕。Python 有很多内置函数,这些函数 (1) 具有常见的名称,(2) 你也不会经常使用。将它们用作局部变量或对象成员是可以的,因为从上下文中很明显你正在做什么:
例如:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
一些具有诱人名称的内置函数:
id
list
,dict
map
all
,any
complex
,int
dir
input
slice
sum
min
,max
object
file
(在Python 3.0中已删除)buffer
(在Python 3.0中已删除)id
函数是CPython实现的细节。同样值得注意的是,该函数仅需要为任何两个存在的对象返回不同的数字。如果一个对象被垃圾回收,它的id可能会被回收利用。 - Zac Critesfile
不再是内置的(虽然大多数语法高亮器仍将其视为内置)。 - CrazyChucky我可能会说些不太受欢迎的话: id()
是一个相当专业的内置函数,在业务逻辑中很少使用。因此,如果在紧凑且精心编写的函数中使用它作为变量名,并且清楚地表明 id 不表示内置函数,那么我认为这并没有问题。
id
内置方法。尽管如此,当我的一个同事用本地变量覆盖了list
内置方法时,我还是花了一些时间才明白。因此,其他人提到的一般规则仍然有意义。 - silviotid
(除了滥用情况之外,我唯一能想象到的使用它的时候是间接使用 x is y
身份运算符,其中 Python 基本上为您执行 id(x) == id(y)
(即您不需要调用它...)。我会将 id
归类为内置函数,并且当您在模块中确实需要它时,请使其超级明确并 import builtins
并将其称为 builtins.id
。 - Nick Tid
参数,但后来尝试使用内置的id
。class Employee:
def __init__(self, name, id):
"""Create employee, with their name and badge id."""
self.name = name
self.id = id
# ... lots more code, making you forget about the parameter names
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
tay = Employee('Taylor Swift', 1985)
预期输出:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Traceback (most recent call last):
File "company.py", line 9, in <module>
tay = Employee('Taylor Swift', 1985)
File "company.py", line 7, in __init__
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
^^^^^^^^
命名任何变量为内置函数都是不好的。其中一个原因是因为对于不知道名称被覆盖的读者来说,这可能会造成困惑。
id
是Python中的内置函数。给id
赋值会覆盖该函数。最好要么添加前缀,例如some_id
,要么使用不同的大小写,例如ID
。
这个内置函数接受一个参数并返回你传入对象的内存地址整数(在CPython中)。
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
由于Python是一种动态语言,通常不建议给变量和函数取相同的名称。在Python中,id()是一个函数,因此不建议使用名为id的变量。请记住,这适用于您可能使用的所有函数...变量不应该与函数同名。
ID
。 - Simon Kuang