【问题标题】:Is a variable the name, the value, or the memory location?变量是名称、值还是内存位置?
【发布时间】:2013-11-01 04:52:15
【问题描述】:

我已经学习 Python 几个月了,而且对 C 也知之甚少,我想知道是否有人可以为我解开这个疑问:

变量是名称、值还是内存位置?

例如:

x = 5

是变量x,x的值,还是x在内存中的位置?

我正在寻找关于什么是变量的清晰解释。我已经看过Wikipedia's page on variablesthis question,但我都不太清楚。如果这是一个重复的问题,那么正确答案的链接会很棒。

谢谢!

【问题讨论】:

  • 在这种情况下,您不了解 C 的事实是一个优势,因为 C 和 python 需要以不同的方式思考变量及其代表的含义。

标签: python variables variable-assignment


【解决方案1】:

x=5 的声明有几件事:

  1. 一个值为5的int对象被创建(或者如果它已经存在则找到它);
  2. 名称x 已创建(或与最后一个标记为“x”的对象解除关联);
  3. 对新的(或找到的)int 对象的引用计数增加 1;
  4. 名称x 与创建(或找到)值为“5”的对象相关联。

由于 int 对象是不可变的,为了提高效率,它们可能是interned。字符串对象更有可能被实习。

这里有一些例子:

>>> x=5    # discussed
>>> id(x)  # the 'id' which in cPython is the memory address.
140246146681256
>>> y=x    # now two names, 'x' and 'y' associated with that object
>>> id(y)  
140246146681256     # same object
>>> z=5    # no guaranteed, likely the same object referred to by 'x' and 'y'
>>> id(z)
140246146681256     # id is the same! The object labeled 'x' was found and labeled 'z'
>>> del x           # ref count to object '140246146681256' decreased by 1
>>> del y           # same
>>> z
5
>>> id(z)
140246146681256    # same object but the names ''x' and 'y' no longer label it

将变量名称(如x=5 中的“x”)视为标签的最佳方式。

可能有没有标签的对象,例如在这个列表理解中创建的 5 个单独的字符串对象:

>>> li=[str(x) for x in range(5)]  
>>> li
['0', '1', '2', '3', '4']

然后您可以创建与这 5 个对象的值独立匹配的对象:

>>> li2=list('012345')    # longer list; completely different construction
>>> li2
['0', '1', '2', '3', '4', '5']    

您可以获取它们各自的内存地址(在 cPython 中)或唯一的 id 地址:

>>> [id(x) for x in li]
[4373138488, 4372558792, 4372696960, 4373139288, 4373139368]
>>> [id(x) for x in li2]
[4373138488, 4372558792, 4372696960, 4373139288, 4373139368,  4372696720]  

请注意,两个独立创建的匿名对象列表是相同的(在本例中为前 5 个)。我故意使用字符串,因为它们更有可能被埋葬......

所以这样想:x=5 发生了两个不同的过程:

  1. 对象被创建(或者如果它是不可变的、被实习的并且存在的)并且被找到
  2. 对象被标记。

【讨论】:

  • 很详细,谢谢!所以如果我理解正确的话,变量是内存中的对象和名称之间的链接?
  • 或多或少是正确的。 Variable 在 Python 中的使用不如在 C 中那么多。我认为最好将其视为对象的名称或标签。对象就在它所在的位置(云、内存、磁盘、要生成的等等)
【解决方案2】:

内存中的某处有一个空间用于存储值。然后通过通常由十六进制数或有时二进制数表示的地址来定位这些内存。因此,这些数字对于程序员来说很难记住,因此他们使用术语变量以一种简单的方式来引用该内存位置,或者您可以说是更高的抽象。所以,x 只是一个名称,它指代内存中包含值 5 的某个位置。仅此而已!

【讨论】:

    【解决方案3】:

    变量是名称到关联存储的映射,用作在程序中引用该存储位置的一种方式。当您分配给变量并对其执行操作时,您正在填充和更改该存储。当您重新分配变量时,您可以将其指向不同的存储位置——您正在重新映射该名称。

    【讨论】:

    • 一些例子会很好,克里斯。
    【解决方案4】:

    在 Python 中,最好将变量视为名称。

    在数字的情况下,数字是不可变的,因此重新分配变量将始终使变量指向不同的数字而不改变数字。

    x = 1
    y = x
    x += 1 # y is still 1
    

    可变对象的区别更明显,您可以在其中更改值或使变量引用不同的值

    x = [1,2,3]
    y = x
    x.append(4) # I mutated x's value, so y is now [1,2,3,4]
    x = [] # I made x point to a different list, so y is still [1,2,3,4]
    

    推荐阅读:

    http://web.archive.org/web/20180411011411/http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

    http://me.veekun.com/blog/2012/05/23/python-faq-passing/

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2022-01-22
      • 1970-01-01
      • 2010-10-01
      • 2017-04-18
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多