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

时间:2013-11-01 04:52:15

标签: python variables variable-assignment

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

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

例如:

x = 5

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

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

谢谢!

4 个答案:

答案 0 :(得分:9)

声明x=5发生了几件事:

  1. 创建一个值为5的int对象(如果已存在,则找到它);
  2. 创建名称x(或与标记的最后一个对象'x'取消关联);
  3. 对新(或找到的)int对象的引用计数增加1;
  4. 名称x与创建(或找到)值为'5'的对象相关联。
  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. 对象已标记。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

变量是名称与关联存储的映射,用作在程序中引用该存储位置的方法。分配给变量并对其执行操作时,您将填充并更改该存储。重新分配变量时,可以将其指向不同的存储位置 - 您正在重新映射该名称。

答案 3 :(得分:1)

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