TypeError: ‘function’ 对象在 Python 中不可下标
TypeError: ‘function’ object is not subscriptable in Python
Python“TypeError: ‘function’ object is not subscriptable”出现在我们使用方括号调用函数或声明与变量同名的函数时。
要解决该错误,请使用括号调用函数并确保函数名称和变量名称不冲突。
在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
省略索引,则认为是,如果省略索引,则切片转到列表的末尾。 0
stop
Python 索引是从零开始的,因此列表中的第一项的索引为0
,最后一项的索引为-1
或len(my_list) - 1
。
字符串切片的语法
是相同的。
使用方括号访问字典中的键
您还可以使用方括号访问字典中的键。
my_dict = { 'site': 'bobbyhadz.com', 'topic': 'Python' } print(my_dict['site']) # 👉️ bobbyhadz.com print(my_dict['topic']) # 👉️ Python
访问从函数返回的值
如果您需要获取从函数返回的值并在特定索引处访问它:
- 使用括号调用方法。
- 使用方括号访问索引处的值。
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__)
我还写了一篇关于
如何检查变量是否为函数的文章。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: