如何确定 Python 变量的类型?

我如何查看变量的类型(无符号 32 位,带符号 16 位等)?

我怎么看?

答案

Python 与 C / C ++ 的类型不同,这似乎是您的问题。

尝试这个:

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123456789L
>>> type(i)
<type 'long'>
>>> type(i) is long
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

不过,在 Python 3.0 中 int 和 long 之间的区别消失了。

您可能正在寻找type()函数。

请参见下面的示例,但是 Python 中没有像 Java 这样的 “无符号” 类型。

正整数:

>>> v = 10
>>> type(v)
<type 'int'>

正整数:

>>> v = 100000000000000
>>> type(v)
<type 'long'>

负整数:

>>> v = -10
>>> type(v)
<type 'int'>

字符的文字顺序:

>>> v = 'hi'
>>> type(v)
<type 'str'>

浮点整数:

>>> v = 3.14159
>>> type(v)
<type 'float'>

很简单。你是这样做的。

print(type(variable_name))

如何确定 Python 中的变量类型?

因此,如果您有一个变量,例如:

one = 1

您想知道它的类型吗?

在 Python 中几乎所有事情都有正确的方法和错误的方法。这是正确的方法:

使用type

>>> type(one)
<type 'int'>

您可以使用__name__属性获取对象的名称。 (这是你需要使用的为数不多的特殊属性之一__dunder__名字去 - 在那里甚至没有一个方法为它inspect 。模块)

>>> type(one).__name__
'int'

不要使用__class__

在 Python 中,以下划线开头的名称在语义上不属于公共 API 的一部分,这是用户避免使用它们的最佳实践。 (除非绝对必要。)

由于type为我们提供了对象的类,因此应避免直接获取它。 :

>>> one.__class__

通常,这是人们在访问方法中的对象类型时首先想到的 - 他们已经在寻找属性,因此类型似乎很奇怪。例如:

class Foo(object):
    def foo(self):
        self.__class__

别。相反,请执行 type(self):

class Foo(object):
    def foo(self):
        type(self)

int 和 float 的实现细节

我如何查看变量的类型(无符号 32 位,带符号 16 位等)?

在 Python 中,这些细节是实现细节。因此,总的来说,在 Python 中我们通常不必担心这一点。但是,要满足您的好奇心...

在 Python 2 中,int 通常是一个等于实现的宽(受系统限制)的有符号整数。通常在 C 中实现为long 。当整数变得更大时,我们通常将它们转换为 Python long(精度不受限制,不要与 C long 混淆)。

例如,在 32 位 Python 2 中,我们可以推论 int 是一个有符号的 32 位整数:

>>> import sys

>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'

在 Python 3 中,旧的 int 消失了,而我们只使用(Python 的)long 作为 int,它具有无限的精度。

我们还可以获得有关 Python 浮点数的一些信息,这些浮点数通常在 C 中以double形式实现:

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, 
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

结论

不要使用语义上非公开的 API __class__来获取变量的类型。请改用type

并且不必太担心 Python 的实现细节。我自己不必处理这个问题。您可能也不会这样做,而且如果您确实做到了,那么您应该了解得足够多,不要去寻找该答案的答案。

print type(variable_name)

在处理此类问题时,我也强烈建议使用IPython交互式解释器。它可以让您键入variable_name?并将返回有关该对象的信息的完整列表,包括类型和该类型的 doc 字符串。

例如

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

如果可能,将字符串或数字转换为整数。浮点参数将被截断为零(不包括浮点数的字符串表示!)转换字符串时,请使用可选的基数。转换非字符串时提供基数是错误的。如果参数在整数范围之外,则将返回一个长对象。

a = "cool"
type(a)
//result
<class 'str'>

or do `dir(a)` to see the list of inbuilt methods you can have on the variable.

使用__class__一种方法:

>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>

Python 中简单类型检查的示例:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

这可能无关紧要。但你可以检查类型与对象的isinstance(object, type)为提到这里

这个问题有点模棱两可 - 我不确定您所说的 “视图” 是什么意思。如果您要查询本机 Python 对象的类型, @ atzz的答案将引导您朝正确的方向发展。

但是,如果您尝试生成具有原始 C 型语义的 Python 对象(例如uint32_tint16_t ),请使用struct模块。您可以这样确定给定 C 类型原语中的位数:

>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4

这也反映在array模块中,该模块可以创建以下较低类型的数组:

>>> array.array('c').itemsize # char
1

sys.maxint给出了支持的最大整数(Python 2 的int )。

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

还有sys.getsizeof ,它返回剩余内存中Python对象的实际大小:

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

对于浮点数据和精度数据,请使用sys.float_info

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)