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

yc0p9oo0  于 2021-08-20  发布在  Java
关注(0)|答案(4)|浏览(342)

我已经学习python几个月了,对c语言也知之甚少,我想知道是否有人能帮我澄清这个疑问:
变量是名称、值还是内存位置?
例如:

x = 5

是变量x、x的值还是x在内存中的位置?
我在寻找一个变量是什么的清晰解释。我已经看过wikipedia关于变量和这个问题的页面,但都不太清楚。如果这是一个重复的问题,链接到正确的答案将是伟大的。
谢谢

plupiseo

plupiseo1#

这一声明有几方面的内容 x=5 :
值为的int对象 5 已创建(如果已存在,则找到);
名字 x 已创建(或与标记为“x”的最后一个对象解除关联);
新(或找到的)int对象的引用计数增加1;
名字 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

考虑变量名称的最佳方式,如 x=5 这是一个标签。
可以有没有标签的对象,例如在此列表中创建的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 :
对象被创建(如果它是不可变的、内部的和存在的,则被发现)并
对象已标记。

k3bvogb1

k3bvogb12#

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

p5cysglq

p5cysglq3#

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

r6hnlfcb

r6hnlfcb4#

在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/

相关问题