Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态键入是否意味着存储位置或值的改变?_Python_Language Agnostic_Programming Languages_Dynamic Typing - Fatal编程技术网

Python 动态键入是否意味着存储位置或值的改变?

Python 动态键入是否意味着存储位置或值的改变?,python,language-agnostic,programming-languages,dynamic-typing,Python,Language Agnostic,Programming Languages,Dynamic Typing,如果我是正确的,动态类型就是Python中的一个例子 x=1 x='abc' x可以在运行时的不同点引用不同类型的值 在上面的例子中,x指的是什么 名称,即标识符x x所指的存储器 还是别的什么 我的问题是关于一般编程语言中动态类型的概念,而不是特定于Python,尽管我们可以使用Python作为示例 通常在编程语言中,不仅仅是Python,动态类型指的是以下哪种解释: 名称在不同的点绑定到不同的内存位置 在运行时,不同的内存位置存储 不同类型 这听起来像是动态地更改名称和名称之间的绑定

如果我是正确的,动态类型就是Python中的一个例子

x=1
x='abc'
x
可以在运行时的不同点引用不同类型的值

在上面的例子中,
x
指的是什么

  • 名称,即标识符
    x
  • x
    所指的存储器
  • 还是别的什么
我的问题是关于一般编程语言中动态类型的概念,而不是特定于Python,尽管我们可以使用Python作为示例

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

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

    这听起来像是动态地更改名称和名称之间的绑定 对象,如动态范围的特定用法,当更改名称所指的对象时,它也会更改所指对象的类型。因此,动态作用域的具体用法与动态类型类似,因为在这两种情况下对象的类型都会发生变化

    那么,如果这是真的,那么动态类型和用于更改类型的动态作用域的特定用法之间有什么区别呢

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

  • 还是别的什么


  • 谢谢。

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

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

    x
    引用的类型

    因此,
    x
    是名称和标识符。在Python中,它是无类型的。在静态语言中,它被指定了一个类型。通常,在实现方面,静态类型语言只需将源代码中的变量名转换为编译代码引用的内存地址,但Python中并非如此


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

    动态作用域似乎完全不同。发件人:

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


    因此,这与动态范围无关。

    3:内存地址不是Python的一个功能,您不应该关心它们。内置函数id的文档包含您需要的信息imho:在您的示例中,名称
    x
    重新绑定到具有不同标识和不同类型的不同对象。内部实现可能会选择将其放在不同的内存中,但这并不重要。“通常在编程语言中”显然太宽泛了,而且没有唯一的方法可以做到这一点。@imreal听起来像是动态作用域,即在运行时更改名称
    x
    绑定到的对象?见我的观点1.谢谢。我有点理解动态类型和动态范围划分是为了不同的目的。然而,在我最初的帖子中,我没有详细说明我提到的动态作用域是一种特定用法,即当名称引用的对象发生更改时,对象的类型也会发生更改。因此,动态作用域的这种特定用法看起来与动态类型类似,因为在这两种情况下对象的类型都会发生变化。我希望我的评论能帮助您理解我对动态类型和动态范围的这种特殊用法之间的混淆。