我怎样才能看到一个变量的类型是无符号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'>
如何确定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__
}
class Foo(object):
def foo(self):
self.__class__
不要';不要。 相反,做type(self)。
class Foo(object):
def foo(self):
type(self)
如何查看一个变量的类型是无符号32位,还是有符号16位等?
在Python中,这些具体细节都是实现细节。 所以,一般情况下,我们在Python中通常不担心这个问题。 然而,为了满足你的好奇心......
在Python 2中,int通常是一个有符号的整数,等于实现'的[word][1]宽度(受系统限制)。 它'通常被实现为[C中的long][2]。 当整数大于这个值时,我们通常会将其转换为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,它具有[无限精度。][3] 。
我们还可以得到一些关于Python'的浮点数的信息,在C语言中,浮点数通常被实现为[double][2]。
>>> 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的实现细节。 我自己还没有处理过这方面的问题。 你可能也不会,如果你真的需要,你应该知道足够的知识,而不是从这个答案中寻找该怎么做。
[1]: https://en.wikipedia.org/wiki/Word_(computer_architecture) [2]: https://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex [3]: https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
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
如果可能的话,将字符串或数字转换为整数。 浮点参数将被截断为零(这不包括字符串 表示的浮点数!) 当转换一个字符串时,使用可选的基数。 在转换非字符串时,提供一个基数是一个错误。 非字符串时提供基数是错误的。如果参数超出了整数范围,将返回一个长形对象 将被返回。
这个问题有点含糊不清 -- 我不确定你说的 "查看 "是什么意思。如果你想查询一个本地 Python 对象的类型,@atzz'的回答将引导你走向正确的方向。
然而,如果你想生成具有原始C类型语义的Python对象,(如uint32_t
, int16_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
支持的最大整数(Python 2'的int
)由 sys.maxint 给出。
>>> 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)
你是指在 Python 中还是使用 [ctypes][2]?
在第一种情况下,你根本不可能 - 因为 Python 没有有符号/无符号、16/32 位的整数。
在第二种情况下,你可以使用type()
。
>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>
关于ctypes及其类型的更多参考,请参见[官方文档][3]。
1:
[2]: http://www.python.org/doc/2.5/lib/module-ctypes.html [3]: http://docs.python.org/library/ctypes.html
这真的取决于你指的是什么级别。
在Python 2.x中,由于历史原因,有两种整数类型,int
(约束为sys.maxint
)和long
(无限精度)。
在Python代码中,这不应该有一点区别,因为当一个数字过大时,解释器会自动转换为long。
如果你想知道底层解释器中实际使用的数据类型,那'是依赖于实现的。
(CPython'的位于Objects/intobject.c和Objects/longobject.c中。)要了解系统类型请看cdleary使用struct模块的答案。
对于python2.x,使用
print type(variable_name)
对于python3.x,使用
print(type(variable_name))
就不要做了。 求某物'的类型本身就是错误的。 相反,使用多态性。 找到或者必要时自己定义一个方法,对任何可能的输入类型做你想做的事情,然后调用它,而不需要询问任何事情。 如果你需要使用内置类型或第三方库定义的类型,你总是可以从他们那里继承并使用你自己的派生类型来代替。 或者你可以把它们封装在自己的类里面。 这是解决此类问题的面向对象的方式。
如果你坚持检查精确的类型,并在这里和那里放置一些肮脏的if
s,你可以使用__class__
属性或type
函数来做,但很快你会发现自己每两三次提交就会用额外的情况更新所有这些if
s。
用OO的方式来做可以避免这种情况,让你只为新的输入类型定义一个新的类。