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

时间:2008-09-16 21:50:59

标签: python

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

9 个答案:

答案 0 :(得分:119)

id()是一个基本的内置:

  

模块中内置函数id的帮助   __builtin__

     
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.)

通常,使用以任何语言遮蔽关键字或内置函数的变量名称都是一个坏主意,即使它是允许的。

答案 1 :(得分:47)

id是一个内置函数,它给出了一个对象的内存地址。如果您为自己的某个职能id命名,则必须说__builtins__.id才能获得原始职能。除了小脚本之外,全局重命名id令人困惑。

但是,只要使用本地名称,重复使用内置名称作为变量并不是那么糟糕。 Python有一个很多的内置函数,(1)具有通用名称,(2)你不会使用太多。使用这些作为局部变量或作为对象的成员是可以的,因为从上下文中可以明显看出你在做什么:

示例:

def numbered(filename):
  file = open(filename)
  for i,input in enumerate(file):
    print "%s:\t%s" % (i,input)
  file.close()

一些具有诱人名字的内置插件:

  • id
  • file
  • list
  • map
  • allany
  • complex
  • dir
  • input
  • slice
  • buffer

答案 2 :(得分:41)

PEP 8 - Python代码风格指南中,以下指南显示在Descriptive: Naming Styles 部分中:

  
      
  • single_trailing_underscore_:惯例用于避免冲突   使用Python关键字,例如

         

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

  •   

因此,要回答这个问题,适用本指南的一个例子是:

id_ = 42

在变量名中包含尾随下划线可以明确意图(熟悉PEP 8中的指南)。

答案 3 :(得分:40)

我可能会说一些不受欢迎的事情:id()是一个相当专业的内置函数,在业务逻辑中很少使用。因此,我没有看到在一个紧凑且编写良好的函数中将它用作变量名的问题,其中很明显id并不意味着内置函数。

答案 4 :(得分:4)

在内置函数之后命名任何变量是不好的。其中一个原因是因为对于不知道名称被覆盖的读者来说可能会造成混淆。

答案 5 :(得分:2)

其他人提到它令人困惑,但是我想在为什么上进行扩展。这是一个基于真实故事的示例。基本上,我写了一个带有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)

预期输出:

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

嗯?我要在哪里叫int?这些都是内置的...

如果我将其命名为badge_idid_,就不会遇到这个问题。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

'id'是Python中的内置方法。将值分配给“id”将覆盖该方法。最好在“some_id”之前使用标识符,或者在不同的大小写方法中使用它。

内置方法接受一个参数,并为您传递的对象的内存地址返回一个整数。

>>> ID(1)

9787760

>>> x = 1

>>> ID(x)的

9787760

答案 8 :(得分:-6)

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