【问题标题】:Python variables under the hood引擎盖下的 Python 变量
【发布时间】:2019-10-10 15:17:23
【问题描述】:
  1. 说所有 Python 变量都是指向某个数据对象(如 int 或 list)的指针(就 C 而言)是否正确?例如a = 5 将对象 int(5) 的地址放入 a 中,其中 a 有自己的地址,这是无用的(我认为)。

  2. 而Python中定义了print,用于打印a中存储的地址所指向的对象的内容。

  3. 并且在Python中定义了id来打印a中存储的地址。

这是真正发生在幕后的事情吗?

【问题讨论】:

  • 两者都不是。在 python 中,变量只不过是你给对象的名字,你可以用来引用这些对象。
  • 没有单一的 Python 实现。
  • 类似于stackoverflow.com/questions/58293498/python-names-and-variables/…(完全披露:我也回答了这个问题)。
  • id(a) 可能会返回从内存地址派生的东西,但这对你没有任何用处:你不能在 Python 中取消引用任意内存,所以它也可能是一个随机生成的值。

标签: python


【解决方案1】:
  1. 不是真的,但很接近。 Python 变量是一个引用对象的名称。句号。 Python 没有定义任何关于如何完成的语义。

  2. print 将对象作为参数。该对象可以通过文字(print(3)print("foo")print(True))或通过引用(print(a))传递。

  3. id 返回一个整数标识符,该标识符在该对象的生命周期内对该对象唯一。整数 是什么 也不是由语言定义的;由实施决定。它也可以是一个以 0 开头并在每次创建新对象时递增的序列号。

任何关于“幕后”的问题只能通过指定您正在使用的 Python 实现来回答,而该答案对于理解特定 Python 的含义并没有任何用处,只能用于理解特定的实现

【讨论】:

【解决方案2】:

看看这个相当古老但仍然相关的问题Are python variables pointers? or else what are they? 在一个很好的讨论here 中也引用了它。

是的,您可以将任何哈佛或冯诺依曼架构中的变量视为“指针”,因为对象在内存中具有地址。您使用的词会因编码语言等而有所不同,但很快讨论就会变成大量相互矛盾的意见,因为它太开放了。

我也是一名 C 程序员,当我开始使用 Python 时,我尝试将我的所有代码都转换为 C。它不起作用,因为 Python 将你从寻址中抽象出来。

一个很好的例子:如果您在 Python 中声明两个对象,并且它们都具有相同的值和类型,那么它们可能具有相同的内存地址(我认为使用 id() 检查)。节省资源非常有意义。只有当两者不同时,Python 才会将一个对象转移到内存中的不同位置。在 C 中,你“不会”明白这一点,因为它是一种编译语言,而不是脚本语言。如果你是通过一个指针变量来实现的……这个变量有它自己的地址,那么无论如何你都必须非常小心,这既是 C 的强大之处,也是它的弱点。

脚本语言和编译语言之间存在显着差异。无论如何,阅读链接中的问题/答案,它真的很不错。

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2018-05-21
    • 2018-12-04
    相关资源
    最近更新 更多