我学习Python有几个月了,对C也了解很少,我想知道是否有人可以为我解答这个疑问:
变量是名称、值还是内存位置?
例如:
x = 5
变量x、x的值、还是x在内存中的位置?
我正在寻找关于变量是什么的清晰解释。我已经看过维基百科关于变量的页面和这个问题,但对我来说都不太清楚。如果这是一个重复的问题,最好有正确答案的链接。
谢谢!
该声明有几个问题
x=5
:
5
的 int 对象(如果已经存在则找到);x
已创建(或与最后一个标记的对象“x”解除关联);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
:
正在发生两个不同的过程对象被创建(或者如果它是不可变的、被保留且存在的话则被找到)并且
就数字而言,数字是不可变的,因此重新分配变量总是会使变量指向不同的数字,而不会更改数字。
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.htmlhttp://me.veekun.com/blog/2012/05/23/python-faq-passing/
在 Python 中,数据由
object
object
identity
、type
和value
。
identity
id()
函数来检查对象的id。在 CPython 中,id 是对象的内存地址。type
type()
检查。value
x=5
时会发生什么?
anobject
type
int,value
5 被创建(或重用,如果已经有)。名为
variable
x
指代该对象。对象的引用计数器增加 1。仅此而已。