0

我的问题更像是一个理解问题,而不是一个严格的编程问题。我知道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 的新值改变了 a 指向的值

4

3 回答 3

3

呼叫b.append不会分配b给新列表。它仍然指向内存中的相同位置。

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

由于更改的是基础数据,因此也指向该数据的任何其他标识符都会受到影响。

于 2013-07-19T14:22:14.067 回答
0

这个之前已经讲过很多次了。简短的回答是它们不是严格的指针。它们更像是标签。在您的顶级情况下, b 被重新标记为 4 并因此发生变化。在您的底部情况下(带有数组) b 没有重新标记,而只是附加了它的内容。这就是为什么数组似乎表现不同的原因。

于 2013-07-19T14:22:20.210 回答
0

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

分配给 b 的新值改变了 a 指向的值

您在哪里看到赋值运算符b.append(4)?你没有重新绑定b,你正在改变它。它仍然是绑定到名称ab.

于 2013-07-19T14:25:32.920 回答