我的问题更多的是一个理解问题,而不是严格的编程问题。 我知道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的新值更改了
指向的值答案 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
,你正在改变它。它仍然是绑定到a
和b
两个名称的相同列表对象。