问题的提出
考虑下面这个最小的例子,其中发生了一个TypeError: 'float' object is not subscriptable
。
variable = 42.42
x = variable[0]
这产生了以下的输出。
Traceback (most recent call last):
File "C:\Users\xcent\Desktop\code.py", line 2, in <module>
x = variable[0]
TypeError: 'float' object is not subscriptable
解决方案概述
如果你在一个不可索引的浮动变量上使用方括号符号进行索引或切片,Python会引发TypeError: 'float' object is not subscriptable
。
然而,float类并没有定义这个 [__getitem__()](https://blog.finxter.com/python-__getitem__-magic-method/)
方法。
variable = 1.23
variable[0] # TypeError!
variable[1:10] # TypeError!
variable[-1] # TypeError!
你可以通过以下方式解决这个错误
- 使用函数将浮点数转换为字符串。
[str()](https://blog.finxter.com/python-str-function/)
函数转换为字符串,因为字符串是可下标的。 - 删除索引或切片调用来解决这个错误。
- 定义一个假的
[__getitem__()](https://blog.finxter.com/python-__getitem__-magic-method/)
方法,为一个自定义的float包装类。
方法1:将浮点数转换为字符串
如果你想访问浮动值的各个数字,可以考虑使用内置函数将浮动值转换为字符串。 [str()](https://blog.finxter.com/python-str-function/)
内置函数将浮点数转换成字符串。字符串是可下标的,所以当试图对转换后的字符串进行索引或分片时,不会发生错误。
variable = 42.42
my_string = str(variable)
print(my_string[0])
# 4
print(my_string[1:4])
# 2.4
print(my_string[:-1])
# 42.4
方法2:将浮点放入列表中
解决这个错误的一个简单方法是将浮点数放入一个可下标的列表中--即你可以在定义__getitem__()
魔法的列表上使用索引或切片。
variable = [42.42]
x = variable[0]
print(x)
# 42.42
或者另一个有多个浮点数的例子-现在开始真正有意义了。
sensor = [1.2, 2.1, 3.2, 0.9, 4.2]
print(sensor[0])
# 1.2
print(sensor[-1])
# 4.2
print(sensor[:])
# [1.2, 2.1, 3.2, 0.9, 4.2]
方法3:定义__getitem__()魔法方法
你也可以在float变量周围定义你自己的包装类型,为其定义一个(假的)方法 [__getitem__()](https://blog.finxter.com/python-__getitem__-magic-method/)
的方法,这样每次索引或切分操作都会返回相同的浮点数。
class MyFloat:
def __init__(self, f):
self.f = f
def __getitem__(self, index):
return self.f
my_float = MyFloat(42.42)
print(my_float[0])
# 42.42
print(my_float[100])
# 42.42
这个黑客一般不推荐使用,我把它包括进来只是为了便于理解和教你一些新东西。
摘要
如果你像访问一个列表一样访问一个浮点f
,比如f[0]
,就会发生错误信息 "TypeError: 'float' object is not subscriptable
" 。为了解决这个错误,避免在浮点数上使用切片或索引,而是使用一个可下标的对象,如列表或字符串。