改变var1的值

时间:2013-07-19 14:16:41

标签: python pointers variable-assignment

我的问题更多的是一个理解问题,而不是严格的编程问题。 我知道python变量实际上是指针,这意味着它们实际上并不存储值,而是指向存储该值的内存中的位置。 我无法弄清楚以下两种情况有何不同:

>>> a = 3
>>> b = a
>>> a
3
>>> b
3
>>>b = 4
>>> b
4
>>> a
3

分配给'b'的新值不会更改'a'指向的值。反对:

>>> a = [1,2,3]
>>> b = a
>>> a
[1,2,3]
>>> b
[1,2,3]
>>> b.append(4)
>>> b
[1,2,3,4]
>>> a
[1,2,3,4]

分配给b的新值更改了

指向的值

3 个答案:

答案 0 :(得分:3)

调用b.append不会将b分配给新列表。它仍然指向记忆中的相同位置。

>>> b = [1,2,3]
>>> id(b)
36586568L
>>> b.append(4)
>>> id(b)
36586568L

由于基础数据发生了变化,因此指向该数据的任何其他标识符都将受到影响。

答案 1 :(得分:0)

之前已经多次介绍过这个问题。简短的回答是,它们不是严格的指针。它们更像是标签。在您的大写字母中,b被重新标记为4,因此会发生变化。在您的底部情况下(使用数组)b不会重新标记,但只会将其内容附加到。这就是阵列似乎采取不同行为的原因。

答案 2 :(得分:0)

Python“变量”(“绑定”将是更合适的术语)不是指针,它们是命名空间中的键 - >值对。命名空间和查找的实现方式是一个实现细节,但你可以认为它是一个哈希表(Python的dict)。

  

分配给b的新值更改了

指向的值

您在b.append(4)哪里看到了分配运营商?你没有重新绑定b,你正在改变它。它仍然是绑定到ab两个名称的相同列表对象。