在Python中,所有值都是具有内置类型信息的对象.变量是对这些值的引用.所以他们的类型是"动态的",恰好等于他们在特定时刻碰巧(指向)的类型.
每当为变量的内容分配内存时,就有值.由于它具有类型,因此所需的存储量是已知的.
引用(变量)本身总是占用相同数量的内存,无论它们指向什么,因为它们只包含一个概念性地址.
这确实意味着在
def f (x):
print (x)
Run Code Online (Sandbox Code Playgroud)
x没有类型,因为它还没有特定的值.好处是这非常灵活.缺点是编译器只有有限的方法来发现错误.出于这个原因,Python最近丰富了类型提示.像mypy这样的工具允许静态类型检查,即使解释器不需要它.但程序员有时会这样做,尤其是在她在团队中工作时的模块边界(API).
动态类型语言通常使用盒装表示,其包括运行时类型信息.例如,系统不使用存储指向值的直接指针,而是使用包含值(或指向它的指针)的框结构以及一些其他元信息.你可以在这里看到他的标准Python实现是如何做到的:https://github.com/python/cpython/blob/master/Include/object.h
这里可以使用一些有趣的技巧.例如,一种技术是值标记,其中类型描述作为值本身的一部分存储,利用未使用的字节.例如,当前x86-64 CPU上的指针无法使用完整的地址空间,这会为您提供一些位.这种技术的另一个变体是NaN标记(我相信这是由LuaJIT的作者Mike Pall首次使用) - 其中所有值都存储为双精度值,并且值的各种NaN状态表示它实际上是指针或其他数据类型.