如何确定Python变量的类型?

时间:2008-12-31 07:58:58

标签: python types unsigned signed 16-bit

如何查看变量的类型,无论是无符号32位,带符号16位等?

如何查看?

16 个答案:

答案 0 :(得分:1133)

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之间的区别消失了。

答案 1 :(得分:370)

您可能正在寻找type()功能。

请参阅下面的示例,但Python中没有“unsigned”类型,就像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'>

答案 2 :(得分:152)

这很简单。你是这样做的。

print(type(variable_name))

答案 3 :(得分:93)

  

如何在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__

唐&#39;吨。相反,请键入(self):

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

整数和浮动的实施细节

  

如何查看变量的类型,无论是无符号32位,带符号16位等?

在Python中,这些细节是实现细节。因此,一般来说,我们通常不会在Python中担心这一点。但是,为了满足你的好奇心......

在Python 2中,int通常是一个有符号整数,等于实现的word宽度(受系统限制)。它通常以long in C的形式实现。当整数大于此值时,我们通常将它们转换为Python long(具有无限精度,不要与C longs混淆)。

例如,在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&#39; s)为int,它有unlimited precision.

我们还可以获得有关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)

结论

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

并且不要过多担心Python的实现细节。我自己没有处理过这个问题。你可能也不会,如果你真的这样做,你应该知道不要为这个答案寻找答案。

答案 4 :(得分:53)

print type(variable_name)

在处理这样的问题时,我也强烈推荐IPython互动口译员。它允许您键入variable_name?并返回有关该对象的完整信息列表,包括该类型的类型和文档字符串。

e.g。

In [9]: var = 123

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

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

答案 5 :(得分:36)

使用__class__的另一种方式:

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

答案 6 :(得分:28)

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

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

答案 7 :(得分:24)

这个问题有点含糊不清 - 我不确定你对“观点”的意思。如果您正在尝试查询本机Python对象的类型,@atzz的答案将引导您朝着正确的方向前进。

但是,如果您尝试生成具有原始C类型语义的Python对象(例如uint32_tint16_t),请使用{{ 3}}模块。您可以确定给定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

支持的最大整数(Python 2的int)由struct给出。

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

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

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

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

>>> 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)

答案 8 :(得分:21)

可能没那么无关紧要。但您可以使用here isinstance(object, type) {{1}}检查对象的类型。

答案 9 :(得分:18)

您的意思是Python还是使用ctypes

在第一种情况下,你根本不能 - 因为Python没有签名/无符号,16/32位整数。

在第二种情况下,您可以使用type()

>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>

有关ctypes及其类型的更多参考,请参阅the official documentation

答案 10 :(得分:15)

Python没有您描述的类型。有两种类型用于表示整数值:int,它对应于C中平台的int类型,long,它是一个任意精度整数(即它根据需要增长,并且没有上限)。如果表达式生成无法存储在int中的结果,则long会以静默方式转换为int

答案 11 :(得分:10)

这取决于你的意思。在Python 2.x中,由于历史原因,有两种整数类型int(约束为sys.maxint)和long(无限精度)。在Python代码中,这应该没有什么区别,因为当数字太大时,解释器会自动转换为long。如果您想了解底层解释器中使用的实际数据类型,那将依赖于实现。 (CPython位于Objects / intobject.c和Objects / longobject.c中。)要了解系统类型,请查看使用struct模块的cdleary答案。

答案 12 :(得分:10)

简单,适用于python 3.4及以上版本

print (type(variable_name))

Python 2.7及以上

print type(variable_name)

答案 13 :(得分:10)

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

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

答案 14 :(得分:6)

对于python2.x,请使用

print type(variable_name)

对于python3.x,请使用

print(type(variable_name))

答案 15 :(得分:-9)

请不要这样做。要求某种类型本身是错误的。而是使用多态。查找或根据需要自己定义对任何可能的输入类型都可以执行所需操作的方法,然后直接调用它而无需询问任何内容。如果需要使用内置类型或第三方库定义的类型,则始终可以从它们继承并使用自己的派生类。或者,您也可以将它们包装在自己的类中。这是解决此类问题的面向对象方法。

如果您坚持检查确切的类型并在此处四处放置一些脏的if,则可以使用__class__属性或type函数来完成,但是很快您就会发现自己每两到三次提交,用所有其他情况更新所有这些if。 OO方法可以避免这种情况,只允许您为新的输入类型定义新的类。