Python中没有指向变量的指针。尤其是,当你这样说的时候:Is the statement replacing the pointer c -> a with pointer c -> b...
Python没有“指针c -> a”这样的东西,所以它没有这样做。在...or grabbing the value from b and overwriting a with b's value
但是没有赋值给a,所以它也没有这样做。在
相反,Python保留了一个符号表1,它将每个名称(a、b、c等)映射到指向对象的指针。在您的代码示例中,在分配给a和b之后,它将如下所示(显然,我已经组成了内存地址):a -> 0xfffa9600 -> 1
b -> 0xfffa9608 -> 2
然后在指定c = a之后,它将如下所示:
^{pr2}$
注意,c完全独立于a。运行c = b时,它将符号表中与c关联的指针替换为与b关联的指针,但a不受影响:a -> 0xfffa9600 -> 1
b -> 0xfffa9608 -> 2
c -> 0xfffa9608 -> 2
在本例中,这几乎就是它的全部,因为所讨论的对象,即整数常量1和{},是不可变的。但是,如果使用可变对象,它们的行为会变得更像指针,因为当对象存储在一个变量中时,对象的更改会反映在引用同一对象的其他变量中。例如,考虑以下代码示例:x = {'a': 1, 'b': 2}
y = x
在这里,符号表可能如下所示:x -> 0xffdc1040 -> {'a': 1, 'b': 2}
y -> 0xffdc1040 -> {'a': 1, 'b': 2}
如果你现在跑y['b'] = y['a']
然后它实际上不会更改符号表中与y关联的指针,但它确实更改了该指针指向的对象,因此您最终得到x -> 0xffdc1040 -> {'a': 1, 'b': 1}
y -> 0xffdc1040 -> {'a': 1, 'b': 1}
您将看到您对y['b']的赋值也影响了x。把这个和y = {'a': 1, 'b': 2}
这实际上使y指向一个完全不同的对象,并且更类似于您之前使用a、b和{}所做的操作。在
1实际上有几个符号表,对应于不同的范围,Python有检查它们的顺序,但是这个细节在这里并不特别相关。在