Python某些关键字似乎可用作变量名



我在Python(3.7.6(中偶然发现了一个有趣的现象。我想在序言中说,这样命名变量是一个可怕的想法,永远不应该这样做。然而,以下代码令人惊讶地编译了:

list = (123, "abc", 222, "foo", "bar", 333); #Tuple named list
print(list);

但是:

list = (123, "abc", 222, "foo", "bar", 333);
list = list(list);
print(list);

由于元组不可调用,引发类型错误,并且它可能认为您正在尝试调用元组,而不是将元组强制转换为列表。

当然,通过如下更改变量名称:

a = (123, "abc", 222, "foo", "bar", 333);
a = list(a);
print(a);

可以成功地将元组强制转换为列表。这种行为似乎存在于几个不同的关键字中。然而,对于某些关键字,这种行为是看不到的,例如with from。有人能解释这种疯狂吗?具体来说,什么关键词可以用作这样的变量,为什么一开始就允许这样做?

list不是python关键字。它是绑定到builtins.list的对象(特别是类型对象(,在所有模块中用作回退。在名称空间中分配list变量时,将屏蔽原始类型对象。类型对象在builtins 中仍然可用

>>> import builtins
>>> list = "foo"
>>> list("bar")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>> builtins.list("bar")
['b', 'a', 'r']

你总是可以把它取回

>>> list=builtins.list
>>> list("bar")
['b', 'a', 'r']

但最好避免与这些类型的人发生冲突。dir(builtins)会告诉你要避免什么。

list是一个内置函数。它不是关键字。整个关键字列表可以在这里看到-Python关键字

关键字既不能用作变量名,也不能用作任何对象名。但是内置函数名可以按照您所说的重新定义。

常见的混合用法是id。例如,

def getTableFromDatabase(id):
    print ( id(dbname) ) # error, cos id is not a function
    return getTable(dbname, id)
t = getTableFromDatabase(1)

,其中id用于表的id。但id是内置函数之一。它用于获取对象的哈希id。更好的做法是在这样的关键字前面添加下划线。

def getTableFromDatabase(_id):
    print( id(dbname) ) # prints id of dbname variable
    return getTable(dbname, _id)
t = getTableFromDatabase(1)

最新更新