动态类型是指内存位置的变化还是值的变化?

时间:2016-09-20 15:16:21

标签: python language-agnostic programming-languages dynamic-typing

如果我是正确的,动态类型例如在Python中

x=1
x='abc'

x可以在运行时引用不同点的不同类型的值。

在上面的例子中,x在这里引用,

  • 名称ieidentifier x
  • x引用的内存,
  • 或其他什么?

我的问题是关于编程语言中动态类型的概念,虽然我们可以使用Python作为示例,但不是特定于Python的。

通常在编程语言中,不仅仅是Python,动态类型中的以下哪些解释参考:

  1. 名称绑定到不同点的不同内存位置 在运行时,并且不同的内存位置存储值 不同种类。

    这听起来像动态地改变名称和之间的绑定 对象,即类似于动态范围的特定用法,其中当改变名称所指的对象时,它也恰好改变被引用对象的类型。因此动态类型的特定用法看起来类似于动态类型,因为对象的类型在两种情况下都会发生变化。

    因此,如果这个是真的,动态类型和动态范围的特定用法之间有什么区别可以改变类型?

  2. 名称绑定到固定内存位置和内存位置 存储一些值,我们可以更改存储的值及其类型 在运行时的内存位置。

  3. 或其他

  4. 感谢。

2 个答案:

答案 0 :(得分:3)

动态范围似乎完全不同。来自wikipedia

  

对于动态范围,全局标识符是指与最新环境关联的标识符,在现代语言中并不常见。[4]在技​​术术语中,这意味着每个标识符都具有全局绑定堆栈。引入名为x的局部变量会将绑定推送到全局x堆栈(可能已为空),当控制流离开作用域时会弹出该堆栈。在任何上下文中评估x总是产生顶部绑定。请注意,这不能在编译时完成,因为绑定堆栈仅在运行时存在,这就是为什么这种类型的作用域被称为动态作用域。

所以不,这与动态范围没有任何关系。

答案 1 :(得分:2)

您需要查看上下文中的动态类型 ;这里的上下文是静态类型的对比概念。

C,C ++和Java都是静态类型语言,您可以在其中修复变量在编译时可以引用的类型。 Python的变量不是那样固定的;您没有指定变量的类型。变量只是对对象的引用,因此类型x引用在运行时确定。

所以x名称,即标识符。在Python中它是无类型的。在静态语言中,已为其分配了一种类型。通常,在实现方面,静态类型语言只是将源代码中的变量名称转换为编译代码引用的内存地址,但在Python中则不是这样。

Python实际上如何实现名称并不像Python开发人员需要担心的那样,并且可能因具体实现而异。在CPython(您从Python.org下载的实现)中,标识符是对 heap 中特定位置的引用, heap 是为Python对象保留的内存区域。根据需要动态地在堆中添加和删除对象。