【问题标题】:How to determine a Python variable's type?如何确定 Python 变量的类型?
【发布时间】:2010-09-28 23:39:38
【问题描述】:

如何查看变量的类型是无符号 32 位、有符号 16 位等?

如何查看?

【问题讨论】:

标签: python types unsigned signed 16-bit


【解决方案1】:

没有32bit和64bit和16bit之分,python很简单,不用你操心。看看如何检查类型:

integer = 1
print(type(integer))  # Result: <class 'int'>, and if it's a string then class will be string and so on.

# Checking the type
test = 1.3
print(type(test) == float)  # True

【讨论】:

    【解决方案2】:

    您应该使用type() 函数。像这样:

    my_variable = 5
    
    print(type(my_variable)) # Would print out <class 'int'>
    

    此函数将查看任何变量的类型,无论是列表还是类。查看此网站了解更多信息:https://www.w3schools.com/python/ref_func_type.asp

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    【解决方案3】:

    使用type() 内置函数:

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

    要检查变量是否属于给定类型,请使用isinstance

    >>> i = 123
    >>> isinstance(i, int)
    True
    >>> isinstance(i, (float, str, set, dict))
    False
    

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

    【讨论】:

    • 需要注意的一点(因为问题是关于数字的) - bool 是 int 的子类。所以 isinstance(True, int) 或 isinstance(False, int) 将返回 True。
    【解决方案4】:

    您可能正在寻找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'>
    

    【讨论】:

    • 当我看到这个时,我不得不加倍考虑。 Java SE8 现在包含无符号整数,而且我已经用它开发了很多东西,以至于 Java 在 SE8 之前从未有过无符号整数似乎是有罪的。
    【解决方案5】:
    a = "cool"
    type(a)
    
    //result 'str'
    <class 'str'>
    or 
    do 
    `dir(a)` 
    to see the list of inbuilt methods you can have on the variable.
    

    【讨论】:

      【解决方案6】:

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

      如果你坚持检查确切的类型并在这里和那里放置一些脏的ifs,你可以使用__class__属性或type函数来做到这一点,但很快你会发现自己更新了所有这些if s 每两次或三次提交都有额外的情况。以 OO 方式执行此操作可以防止这种情况发生,并且只允许您为新类型的输入定义一个新类。

      【讨论】:

      • 我真的不知道这个答案在现有答案中添加了什么(可能在第一句话之外?)
      【解决方案7】:
      print type(variable_name)
      

      在处理此类问题时,我也强烈推荐IPython 交互式解释器。它可以让你输入variable_name? 并返回关于对象的完整信息列表,包括类型和该类型的文档字符串。

      例如

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

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

      【讨论】:

      • 我要求提供无符号整数、有符号整数等
      • print type(str) 在 Python 3.6 中返回错误。使用type(str)
      • @KolobCanyon 这是因为在 3.x 中,打印需要括号:print(type(str))
      • 你真的应该修改print type(var)错误代码。
      【解决方案8】:

      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)
      

      整数和浮点数的实现细节

      如何查看变量的类型是无符号 32 位、有符号 16 位等?

      在 Python 中,这些细节是实现细节。所以,一般来说,我们在 Python 中通常不会担心这个问题。不过,为了满足你的好奇心……

      在 Python 2 中,int 通常是一个有符号整数,等于实现的word 宽度(受系统限制)。它通常实现为long in C。当整数大于这个值时,我们通常将它们转换为 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's) long as 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 的实现细节。我不必自己处理这方面的问题。你可能也不会,如果你真的这样做,你应该知道的足够多,不要为了做什么而寻找这个答案。

      【讨论】:

        【解决方案9】:

        对于python2.x,使用

        print type(variable_name)
        

        对于python3.x,使用

        print(type(variable_name))
        

        【讨论】:

          【解决方案10】:

          就是这么简单。你这样做。

          print(type(variable_name))
          

          【讨论】:

            【解决方案11】:

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

            print (type(variable_name))
            

            Python 2.7 及以上版本

            print type(variable_name)
            

            【讨论】:

              【解决方案12】:

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

              assert type(variable_name) == int
              
              assert type(variable_name) == bool
              
              assert type(variable_name) == list
              

              【讨论】:

              • 这应该是公认的答案,因为它显示了如何实际使用返回值。没有人关心在终端中看到type() 的结果,我们希望它进行类型检查,但具体方式并不明显(我假设您必须将类型作为字符串进行比较:if (type(var)=='str'):
              【解决方案13】:

              另一种使用__class__的方法:

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

              【讨论】:

              • re: 评论 "以下划线开头的名称..."(单)下划线与双下划线(“dunders”)非常不同,它们绝对是公共 API,使用它们当然没问题。这可能会有所帮助...youtu.be/wf-BqAjZb8M
              【解决方案14】:

              这可能有点无关紧要。但是您可以使用isinstance(object, type) 来检查对象的类型,如here 所述。

              【讨论】:

              • 我认为这比在检查过程中使用的类型功能要好得多。如果你想检查结果并采取行动,你必须使用 try catch with type 但 isinstance 返回 true 或 false
              【解决方案15】:

              您是指Python 还是使用ctypes

              在第一种情况下,您根本不能——因为 Python 没有带符号/无符号的 16/32 位整数。

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

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

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

              【讨论】:

                【解决方案16】:

                这个问题有点模棱两可——我不确定你所说的“视图”是什么意思。如果您尝试查询本机 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
                

                支持的最大整数(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 中查询“变量”的类型。您的回答通常是正确的,但题外话。
                【解决方案17】:

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

                【讨论】:

                  【解决方案18】:

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

                  【讨论】:

                    猜你喜欢
                    • 2011-02-08
                    • 2019-04-26
                    • 2021-03-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-07-22
                    相关资源
                    最近更新 更多