TypeError: ‘function’ 对象在 Python 中不可订阅

TypeError: ‘function’ 对象在 Python 中不可下标

TypeError: ‘function’ object is not subscriptable in Python

Python“TypeError: ‘function’ object is not subscriptable”出现在我们使用方括号调用函数或声明与变量同名的函数时。

要解决该错误,请使用括号调用函数并确保函数名称和变量名称不冲突。

typeerror 函数对象不可订阅

在Python中使用括号调用函数

错误的一个常见原因是使用方括号而不是圆括号调用函数。

主程序
def greet(name): return 'hello ' + name # ⛔️ TypeError: 'function' object is not subscriptable result = greet['bobby'] # 👈️ should be parentheses not square brackets

请注意,我们使用方括号来调用该greet()函数。

要解决该错误,只能使用括号调用函数。
主程序
def greet(name): return 'hello ' + name result = greet('bobby') print(result) # 👉️ 'hello bobby'

括号用于调用函数或方法,而方括号用于访问字典中的键或列表中的项目。

将列表作为参数传递给函数

一个或多个以逗号分隔的参数可以在对括号之间的函数的调用中传递。

主程序
def greet(first, last): return 'hello ' + first + ' ' + last result = greet('bobby', 'hadz') print(result) # 👉️ 'hello bobby hadz'

如果将列表作为参数传递给函数,请使用括号调用函数并在括号之间传递列表。

主程序
def get_list(a_list): return a_list + ['last'] result = get_list(['bobby', 'hadz']) print(result) # 👉️ ['bobby', 'hadz', 'last']

如果需要访问,可以使用方括号:

  • 特定索引处的列表
  • 特定索引处的元组
  • 特定索引处的字符串
  • 字典中的特定键

列表切片的语法
my_list[start:stop:step].

主程序
a_list = ['bobby', 'hadz', 'com'] print(a_list[0]) # 👉️ bobby print(a_list[-1]) # 👉️ com print(a_list[:2]) # 👉️ ['bobby', 'hadz']

索引start是包含的,stop索引是排他的(最多,但不包括)。

如果start省略索引,则认为是,如果省略索引,则切片转到列表的末尾。 0stop

Python 索引是从零开始的,因此列表中的第一项的索引为0,最后一项的索引为-1len(my_list) - 1

字符串切片的语法
是相同的。

使用方括号访问字典中的键

您还可以使用方括号访问字典中的键。

主程序
my_dict = { 'site': 'bobbyhadz.com', 'topic': 'Python' } print(my_dict['site']) # 👉️ bobbyhadz.com print(my_dict['topic']) # 👉️ Python

访问从函数返回的值

如果您需要获取从函数返回的值并在特定索引处访问它:

  1. 使用括号调用方法。
  2. 使用方括号访问索引处的值。
主程序
def get_list(): return ['bobby', 'hadz', '.', 'com'] a_list = get_list() print(a_list) # 👉️ ['bobby', 'hadz', '.', 'com'] first = get_list()[0] print(first) # 👉️ bobby

拥有同名的函数和变量

这是错误如何发生的另一个示例。

主程序
numbers = [2, 4, 6] def numbers(): return [2, 4, 6] # ⛔️ TypeError: 'function' object is not subscriptable print(numbers[0]) # 👈️ function and variable name clash

当我们有一个函数和一个具有相同名称的变量时,最常引起该错误。

函数numbers覆盖了numbers变量,所以当我们使用方括号访问变量时,我们实际上是在尝试访问 index 处的函数0

主程序
numbers = [2, 4, 6] def numbers(): return [2, 4, 6] # ⛔️ TypeError: 'function' object is not subscriptable print(numbers[0]) # 👈️ function and variable name clash

要解决该错误,请重命名函数或变量,以免它们的名称发生冲突。

主程序
numbers = [2, 4, 6] # ✅ function now has a different name def get_numbers(): return [2, 4, 6] print(numbers[0]) # 👉️ 2 result = get_numbers() print(result[0]) # 👉️ 2

我们将函数重命名为 ,get_numbers这样它就不会再与变量发生冲突,错误就解决了。

“对象不可订阅”TypeError 基本上意味着无法使用方括号访问对象。

您应该只使用方括号来访问可订阅对象。

Python 中的可订阅对象是:

  • 列表
  • 元组
  • 字典
  • 细绳

必须使用list()
tuple()
dict()
str()类将所有其他对象转换为可订阅对象
,以便能够使用括号表示法。

可订阅对象实现该__getitem__方法,而非可订阅对象不实现。

主程序
a_list = ['c', 'b', 'a'] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)

我还写了一篇关于
如何检查变量是否为函数的文章。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: