gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:12:38 25 4
gpt4 key购买 nike

学了几个月的Python,对C也知之甚少,不知道有没有人能帮我解开这个疑惑:

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

例如:

x = 5

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

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

谢谢!

最佳答案

声明 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. 对象被标记。

关于python - 变量是名称、值还是内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19721002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com