动态打字是否意味着内存位置的改变或值的改变?[关闭]

Does dynamic typing mean change of memory place or change of value? [closed]

提问人:Tim 提问时间:9/20/2016 最后编辑:Tim 更新时间:9/20/2016 访问量:554

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

7年前关闭。

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

x=1
x='abc'

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

在上面的例子中,这里确实指的是,x

  • 名称 i.e.identifier ,x
  • 内存,指的是,x
  • 还是别的什么?

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

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

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

    这听起来像是动态更改名称和 一个对象,即就像动态范围的特定用法一样,当更改名称所指的对象时,它也恰好会更改所引用对象的类型。因此,动态作用域的特定用法看起来类似于动态类型,因为在这两种情况下,对象的类型都会发生变化。

    因此,如果这是真的,那么动态类型与动态范围用于更改类型的特定用法之间有什么区别?

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

  3. 或者别的什么

谢谢。

与Python 语言无关 的编程语言 动态类型

评论

1赞 Daniel Roseman 9/20/2016
3:内存地址不是 Python 的功能,你不应该关心它们。
0赞 Danielle M. 9/20/2016
内置函数 id 的文档包含您需要的信息恕我直言: docs.python.org/3/library/functions.html#id
0赞 imreal 9/20/2016
在您的示例中,该名称将重新绑定到具有不同标识和不同类型的不同对象。内部实现可能会选择将其放在不同的内存中,但这并不重要。x
0赞 jonrsharpe 9/20/2016
“一般在编程语言中”显然太宽泛了,而且没有一种方法可以做到这一点。
0赞 Tim 9/20/2016
@imreal你说的听起来像是动态范围,即在运行时更改名称绑定到的对象?请参阅我的观点 1。x

答:

2赞 Martijn Pieters 9/20/2016 #1

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

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

名称、标识符也是如此。在 Python 中,它是无类型的。在静态语言中,它被分配了一个类型。很多时候,在实现方面,静态类型语言会简单地将源代码中的变量名称转换为编译代码引用的内存地址,但在 Python 中并非如此。x

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

3赞 Daniel Roseman 9/20/2016 #2

动态范围界定似乎是完全不同的东西。来自维基百科

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

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

评论

0赞 Tim 9/20/2016
谢谢。我有点理解动态类型和动态范围是出于不同的目的。但是,在我原来的帖子中,我没有指定我提到的动态范围是一种特定的用法,当名称引用的对象发生变化时,对象的类型也会发生变化。因此,动态作用域的这种特定用法看起来类似于动态类型,因为在这两种情况下,对象的类型都会发生变化。我希望我的评论能帮助您理解我在动态类型和动态范围更改类型的这种特定用法之间的混淆。