哪些类型的对象属于“可下标”的领域?
6 回答
它基本上意味着对象实现了__getitem__()
方法。换句话说,它描述的是“容器”的对象,这意味着它们包含其他对象。这包括字符串、列表、元组和字典。
在我的脑海中,以下是唯一可下标的内置插件:
string: "foobar"[3] == "b"
tuple: (1,2,3,4)[3] == 4
list: [1,2,3,4][3] == 4
dict: {"a":1, "b":2, "c":3}["c"] == 3
但是mipadi 的回答是正确的——任何实现的类__getitem__
都是可下标的
可编写脚本的对象是记录对其执行的操作的对象,并且可以将它们存储为可以重放的“脚本”。
例如,请参阅:应用程序脚本框架
现在,如果 Alistair 不知道他问了什么并且真正的意思是“可订阅”对象(由其他人编辑),那么(正如 mipadi 也回答)这是正确的:
可下标对象是实现__getitem__
特殊方法的任何对象(想想列表、字典)。
下标在计算中的含义是:“一个符号(名义上写成下标,但实际上通常不写)在程序中单独或与其他人一起使用,以指定数组的元素之一。”
现在,在@user2194711给出的简单示例中,我们可以看到附加元素不能成为列表的一部分,原因有两个:-
1)我们并没有真正调用append方法;因为它需要()
调用它。
2)错误是表示函数或方法不可下标;意味着它们不像列表或序列那样可索引。
现在看到这个:-
>>> var = "myString"
>>> def foo(): return 0
...
>>> var[3]
't'
>>> foo[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
这意味着没有下标或说元素,function
就像它们按顺序出现一样;并且我们无法像我们一样访问它们,在[]
.
还; 正如米帕迪在回答中所说的那样;它基本上意味着对象实现了__getitem__()
方法。(如果它是可下标的)。因此产生了错误:
arr.append["HI"]
TypeError:“builtin_function_or_method”对象不可下标
我有同样的问题。我在做
arr = []
arr.append["HI"]
所以使用[
导致错误。它应该是arr.append("HI")
作为此处较早答案的推论,这通常表明您认为自己有一个列表(或字典,或其他可下标的对象),而实际上却没有。
例如,假设您有一个应该返回列表的函数;
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
现在,当您调用该函数时,something_happens()
由于某种原因没有返回True
值,会发生什么?失败了if
,所以你失败了;gimme_things
没有显式地做return
任何事情——所以事实上,它会隐式地return None
. 然后这段代码:
things = gimme_things()
print("My first thing is {0}".format(things[0]))
将因“NoneType
对象不可下标”而失败,因为,嗯,things
是None
,所以你正在尝试做None[0]
这没有意义,因为......错误消息所说的内容。
有两种方法可以修复代码中的这个错误——第一种是通过things
在尝试使用它之前检查它实际上是否有效来避免错误;
things = gimme_things()
if things:
print("My first thing is {0}".format(things[0]))
else:
print("No things") # or raise an error, or do nothing, or ...
或等效地捕获TypeError
异常;
things = gimme_things()
try:
print("My first thing is {0}".format(things[0]))
except TypeError:
print("No things") # or raise an error, or do nothing, or ...
另一种是重新设计gimme_things
,以确保它始终返回一个列表。在这种情况下,这可能是更简单的设计,因为这意味着如果有很多地方存在类似的错误,它们可以保持简单和惯用。
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
else: # make sure we always return a list, no matter what!
logging.info("Something didn't happen; return empty list")
return []
当然,您放入else:
分支的内容取决于您的用例。也许您应该在失败时引发异常something_happens()
,以使实际出错的地方更加明显和明确?在您自己的代码中添加异常是让自己确切知道发生故障时发生了什么的重要方法!
(另请注意,后一个修复仍然不能完全修复错误——它阻止你尝试下标None
,但things[0]
仍然IndexError
是things
一个空列表。如果你有一个try
,你也可以except (TypeError, IndexError)
捕获它。)