了解变量类型,名称和赋值

时间:2016-10-07 13:02:58

标签: python

在Python中,如果要定义变量,则不必指定其类型,这与其他语言(如C和Java)不同。

那么Python解释器如何区分变量并在内存中提供所需的空间,如intfloat

4 个答案:

答案 0 :(得分:7)

在Python中,所有值都是具有内置类型信息的对象。变量是对这些值的引用。所以他们的类型是“动态的”,恰好等于他们在特定时刻碰巧(指向)的类型。

每当为变量的内容分配内存时,就有值。由于它有一个类型,所以需要的内存量是已知的。

引用(变量)本身总是占用相同数量的内存,无论它们指向什么,因为它们只包含一个概念性地址。

这确实意味着在

def f (x):
    print (x)

x没有类型,因为它还没有特定的值。 好处是这非常灵活。 缺点是编译器只有有限的方法来发现错误。 出于这个原因,Python最近使用type hints进行了丰富。 像mypy这样的工具允许静态类型检查,即使解释器不需要它。 但程序员有时会这样做,尤其是在她在团队中工作时的模块边界(API)。

答案 1 :(得分:6)

动态类型语言通常使用盒装表示,其中包括运行时类型信息。例如。系统使用包含值(或指向它的指针)的框结构以及一些额外的元信息,而不是存储指向值的直接指针。您可以在此处查看标准Python实现的工作原理:https://github.com/python/cpython/blob/master/Include/object.h

这里可以使用一些有趣的技巧。例如,一种技术是值标记,其中类型描述作为值本身的一部分存储,利用未使用的字节。例如,当前x86-64 CPU上的指针无法使用完整的地址空间,这会为您提供一些位。这种技术的另一个变体是NaN标记(我相信这是由LuaJIT的作者Mike Pall首次使用) - 其中所有值都存储为双精度,并且值的各种NaN状态表示它实际上是指针或其他数据类型。

答案 2 :(得分:2)

Python是动态类型语言,这意味着变量的类型是在运行时决定的。因此,python解释器将区分变量的类型(在运行时间中)并在内存中提供所需的确切空间。尽管是动态类型的,但Python是强类型的,禁止未明确定义的操作(例如,向字符串添加数字)。

另一方面,C和C ++是静态类型语言,这意味着变量类型在编译时是已知的。

在编程语言中使用动态类型具有提供更多语言潜力的优势,例如我们可以使用不同类型的列表(例如包含字符和整数的列表)。静态类型不可能这样,因为列表的类型应该从编译时知道...)。
动态类型的一个缺点是编译器解释器在许多情况下必须保留类型记录以便提取变量类型,这使得它与C或C ++相比更慢。

像python这样的动态类型语言也可以强类型化。 Python是强类型的,因为解释器跟踪所有变量类型,并限制了类型的混合方式。

答案 3 :(得分:1)

Python解释器在程序运行时分析每个变量。在运行之前,它不知道你的任何变量中是否有整数,浮点数或字符串。

当你有一个静态类型的语言背景(在我的情况下是Java)时,它有点不寻常。动态类型为大型脚本节省了大量时间和代码行。它可以防止您因为忘记定义某个变量而出错。但是,通过静态类型,您可以更好地控制数据在计算机内存中的存储方式。