如何查看变量的类型?(例如无符号32位)
当前回答
不要这样做。要求某种类型的东西本身就是错误的。而是使用多态性。查找或在必要时自行定义一个方法,该方法可以为任何可能类型的输入执行所需的操作,只需调用它,而无需询问任何问题。如果您需要使用内置类型或由第三方库定义的类型,您可以始终从它们继承并使用自己的派生类型。或者你可以把它们包装在自己的班级里。这是解决此类问题的面向对象方法。
如果你坚持要检查确切的类型,并在这里和那里放置一些肮脏的If,你可以使用__class__属性或类型函数来完成,但很快你就会发现自己每两次或三次提交就会更新所有这些If并添加额外的case。使用OO方法可以防止这种情况,并且只允许为新类型的输入定义一个新类。
其他回答
Python没有您所描述的类型。有两种类型用于表示整数值:int,它对应于C中平台的int类型;long,它是一个任意精度的整数(即,它根据需要增长,没有上限)。如果表达式产生的结果无法存储在int中,则int将被无声地转换为long。
这可能无关紧要。但您可以使用isinstance(object,type)检查对象的类型,如这里所述。
Python是一种动态类型语言。最初创建为字符串的变量可以稍后重新分配为整数或浮点。翻译不会抱怨:
name = "AnyValue"
# Dynamically typed language lets you do this:
name = 21
name = None
name = Exception()
要检查变量的类型,可以使用type()或isinstance()内置函数。让我们看看他们的行动:
Python3示例:
variable = "hello_world"
print(type(variable) is str) # True
print(isinstance(variable, str)) # True
让我们比较两种方法在python3中的性能
python3 -m timeit -s "variable = 'hello_world'" "type(variable) is int"
5000000 loops, best of 5: 54.5 nsec per loop
python3 -m timeit -s "variable = 'hello_world'" "isinstance(variable, str)"
10000000 loops, best of 5: 39.2 nsec per loop
类型大约慢40%(54.5/39.2=1.390)。
我们可以改用type(variable)==str。这会奏效,但这是个坏主意:
要检查变量的值时,应使用==。我们将使用它来查看变量的值是否等于“hello_world”。但是当我们要检查变量是否为字符串时,运算符是否更合适。有关何时使用其中一个或另一个的更详细说明,请查看本文。==更慢:python3-m timeit-s“variable='hello_world'”“type(variable)==str”5000000个循环,每个循环最好为5:64.4 nsec
身份和类型的区别
速度并不是这两种功能之间的唯一区别。实际上,它们的工作方式有一个重要区别:
type只返回对象的类型(它是类)。我们可以使用它来检查变量的类型是否为str。isinstance检查给定对象(第一个参数)是否为:指定为第二个参数的类的实例。例如,变量是str类的实例吗?或指定为第二参数的类的子类的实例。换句话说,变量是str子类的实例吗?
这在实践中意味着什么?假设我们希望有一个自定义类充当列表,但有一些其他方法。因此,我们可以对列表类型进行子类化,并在其中添加自定义函数:
class MyAwesomeList(list):
# Add additional functions here
pass
但是现在,如果我们将这个新类与列表进行比较,则类型和isinstance返回不同的结果!
my_list = MyAwesomeList()
print(type(my_list) is list) # False
print(isinstance(my_list, list)) # True
我们得到不同的结果,因为isinstance检查my_list是列表的一个实例(不是)还是列表的一个子类(因为MyAwesomeList是列表的子类)。如果您忘记了这一差异,它可能会导致代码中出现一些细微的错误。
结论
isinstance通常是比较类型的首选方式。它不仅速度更快,而且考虑了继承,这通常是所需的行为。在Python中,您通常希望检查给定对象的行为是否像字符串或列表,而不一定是字符串。所以,不用检查字符串及其所有自定义子类,只需使用isinstance即可。
另一方面,当您想要显式检查给定变量是否为特定类型(而不是其子类)时,请使用类型。当您使用它时,请这样使用:type(var)is some_type not like this:type(var)==some_type。
Python中的简单类型检查示例:
assert type(variable_name) == int
assert type(variable_name) == bool
assert type(variable_name) == list
不要这样做。要求某种类型的东西本身就是错误的。而是使用多态性。查找或在必要时自行定义一个方法,该方法可以为任何可能类型的输入执行所需的操作,只需调用它,而无需询问任何问题。如果您需要使用内置类型或由第三方库定义的类型,您可以始终从它们继承并使用自己的派生类型。或者你可以把它们包装在自己的班级里。这是解决此类问题的面向对象方法。
如果你坚持要检查确切的类型,并在这里和那里放置一些肮脏的If,你可以使用__class__属性或类型函数来完成,但很快你就会发现自己每两次或三次提交就会更新所有这些If并添加额外的case。使用OO方法可以防止这种情况,并且只允许为新类型的输入定义一个新类。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录