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

Imp*_*ity 9 python variables variable-assignment

我已经学习了几个月的Python,也知道很少的C,我想知道是否有人可以为我清除这个疑问:

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

例如:

x = 5
Run Code Online (Sandbox Code Playgroud)

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

我正在寻找变量是什么的明确解释.我已经查看了维基百科关于变量这个问题的页面,但对我来说都不太清楚.如果这是一个重复的问题,那么指向正确答案的链接将非常棒.

谢谢!

daw*_*awg 9

声明中有几件事情在进行x=5:

  1. 创建一个值为int的int对象5(如果已存在则找到该对象);
  2. x创建名称(或与标记的最后一个对象'x'取消关联);
  3. 对新(或找到)的int对象的引用计数增加1;
  4. 该名称x与创建(或找到)值为"5"的对象相关联.

由于INT对象是不可改变的,它们可以被拘留的效率.字符串对象更有可能被实现.

这里有些例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)

考虑变量名称的最佳方法,如'x'in x=5作为标签.

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

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

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

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

您可以获取其各自的内存地址(在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]  
Run Code Online (Sandbox Code Playgroud)

请注意,两个独立创建的匿名对象列表是相同的(在本例中为前5个).我特意使用字符串,因为它们更容易被内嵌...

所以想一想:两个不同的过程正在发生x=5:

  1. 创建对象(或者如果它是不可变的,实体的并且存在的话)
  2. 对象已标记.


Suj*_*itS 5

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