我在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)