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

问题描述 投票:0回答:5

我学习Python有几个月了,对C也了解很少,我想知道是否有人可以为我解答这个疑问:

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

例如:

x = 5

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

我正在寻找关于变量是什么的清晰解释。我已经看过维基百科关于变量的页面这个问题,但对我来说都不太清楚。如果这是一个重复的问题,最好有正确答案的链接。

谢谢!

python variables variable-assignment
5个回答
13
投票

该声明有几个问题

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. 该物体已被标记。

5
投票


1
投票


1
投票

就数字而言,数字是不可变的,因此重新分配变量总是会使变量指向不同的数字,而不会更改数字。

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/


0
投票

“内存模型”的正式定义是多线程数据访问行为的描述,参见

Memory_model

数据模型

根据你的描述,你要表达的实际上是“数据模型”,参见

Python数据模型

让我尝试总结一下:

在 Python 中,数据由
    object
  1. 表示。
    每个
  2. object
  3. 都有三个关键概念:
    identity
    type
    value
      identity
    1. :值从未改变来标识对象,使用
      id()
      函数来检查对象的id。在 CPython 中,id 是对象的内存地址。
    2. type
    3. :对象的类型,如int/string/list等。从未改变。
      type()
      检查。
    4. value
    5. :对象的值。例如,对于字符串对象,其值为“某个字符串”,并且它是不可变的。
      
      
    变量只是引用对象的符号。
  4. 你的问题

输入:

x=5

时会发生什么?


an
    object
  1. type
    int,
    value
    5 被创建(或重用,如果已经有)。
    名为 
    variable
  2. x
     指代该对象。对象的引用计数器增加 1。
    仅此而已。

© www.soinside.com 2019 - 2024. All rights reserved.