';id';在Python中是一个错误的变量名

';id';在Python中是一个错误的变量名,python,Python,为什么在Python中命名变量id不好?因为它是内置函数的名称。在内置函数之后命名任何变量都不好。其中一个原因是,对于不知道名称被覆盖的读者来说,它可能会让人困惑。id是Python中的内置函数。为id赋值将覆盖该函数。最好在some\u id中添加前缀,或者在id中使用不同的大写形式 内置函数接受一个参数,并返回一个整数作为所传递对象的内存地址(在CPython中) id() 模块中内置函数id的帮助 \uuuuuuuuuuuuuuuuuuuuuuu: id(…) id(对象)->整数 返回对

为什么在Python中命名变量
id
不好?

因为它是内置函数的名称。

在内置函数之后命名任何变量都不好。其中一个原因是,对于不知道名称被覆盖的读者来说,它可能会让人困惑。

id
是Python中的内置函数。为
id
赋值将覆盖该函数。最好在
some\u id
中添加前缀,或者在
id
中使用不同的大写形式

内置函数接受一个参数,并返回一个整数作为所传递对象的内存地址(在CPython中)

id()

模块中内置函数
id
的帮助
\uuuuuuuuuuuuuuuuuuuuuuu

id(…)
id(对象)->整数
返回对象的标识。这保证是独一无二的
同时存在的对象。(提示:这是对象的内存
地址。)

一般来说,在任何语言中使用使关键字或内置函数黯然失色的变量名都是一个坏主意,即使这是允许的。

我可能会在这里说一些不受欢迎的话:
id()
是一个非常专门的内置函数,很少在业务逻辑中使用。因此,我认为在紧凑且编写良好的函数中使用它作为变量名没有问题,很明显,id并不意味着内置函数。

因为python是一种动态语言,所以给变量和函数取相同的名称通常不是一个好主意。id()是python中的一个函数,因此建议不要使用名为id的变量。记住,这适用于您可能使用的所有函数。。。变量不应与函数同名。

是一个内置函数,用于提供对象的标识(在CPython中也是对象的内存地址)。如果您命名了一个函数
id
,则必须说明获取原始函数(或CPython中的
\uuuuuu内置函数\uuuuuuu.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
  • 文件
  • 列表
    目录
  • map
  • 全部
    任何
  • complex
    int
  • dir
  • 输入
  • slice
  • 缓冲区
  • sum
  • min
    max
  • 对象

在《PEP 8-Python代码风格指南》中,以下指南出现在本节中:

  • 单尾随下划线:按惯例使用以避免冲突
    使用Python关键字,例如

    Tkinter.Toplevel(master,class='ClassName')

因此,为了回答这个问题,应用本指南的一个例子是:

id_ = 42

在变量名中添加尾随下划线可以清楚地说明目的(对于熟悉PEP 8指南的人来说)。

其他人也提到了这一点,但我想进一步说明原因。下面是一个基于真实故事的例子。基本上,我编写了一个接受
id
参数的类,但后来尝试使用内置的
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)
预期产出:

在0x7efde30ae910创建员工“Taylor Swift”
实际产量:

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
回溯(最近一次呼叫最后一次):
文件“company.py”,第9行,在
tay=员工('Taylor Swift',1985年)
文件“company.py”,第7行,在_init中__
打印('Created',type(self).\u_name,repr(name),'at',hex(id(self)))
TypeError:“int”对象不可调用
嗯?我在哪里调用int?那些都是内置的


如果我把它命名为
badge\u id
id\u
,我就不会有这个问题。

注意,你可以将一个类属性或方法命名为“id”,它不会触及内置函数。好吧,对于“id”你是对的,但是“大体上…”注释仍然适用,你不认为吗?我当然会避免将它命名为模块全局变量。对于限制在局部范围内的变量,您可以看到相同的函数永远不需要使用内置函数,这不是我所担心的。@Caramdir:Good catch,
id
曾一度计划删除,但最终他们决定不删除它。我无法再编辑我的原始评论,因此我将删除它,以避免将来混淆人们。@EliCourtwright我希望他们已经删除它。多么糟糕的命名方法!一个通用的,通用的名字,在成千上万的地方使用(上下文赋予意义)。所以有人决定在没有上下文的情况下使用它作为全局名称?令人惊讶的是,谷歌自己的Python正则表达式教程()使用了
str='一个示例单词:cat!!'。在任何PEP中都有什么东西说不要这样做吗?大多数人在与内置/关键字冲突的标识符后面加下划线:id\u、map\u、list\u、filter\u等等。更隐蔽的解决方案是使用变量
id
。更好的问题是。。。genius认为为内置函数使用这样一个通用名称是个好主意吗?“因为python是一种动态语言,给变量和函数取相同的名称通常不是个好主意。”--不能给变量和函数取相同的名称。这与它是一种动态语言无关。如果您的意思是赋予属性与同一范围内的其他对象相同的名称,我也不同意。你可能有
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