我在C方面有一些经验,并且在理解Python处理名称(标识符)的方式方面遇到了一些麻烦。根据我的理解,声明列表x = [1, 2]
然后声明一个新标签y = x
,我似乎实际上将x
作为指针,而y
也是一个指针,保持与x相同的地址。但是在Python中我们称之为标签(这些是不同的概念?)。
同样的系统发生在:x = 5
和y = x
。 x
现在是整数的标签,5
和y
也是5
的标签。但是现在当我更改x
时,结果y
将不会改变。所以在后一种情况下,我不认为x
或y
是这个意义上的指针。堆栈上是x
和y
而不是堆?如果是这样,我怎么知道他们是哪一个?在这种情况下应用堆栈和堆的知识是否无用,甚至可能是有害的?我对这部分语言感到很困惑,谢谢你的帮助。
答案 0 :(得分:3)
Python没有“指针”,它没有“变量”,也没有“赋值”。相反,绑定对象引用名称;但我们仍然会调用=
语句“赋值”执行的操作来简化操作。
执行y = x
时,将名称y
绑定到x
中包含的引用(反之亦然;区别并不重要)。处理方式的不同取决于对其进行的进一步操作。
x = [] # A new list object is bound to x
y = x # The reference bound to x is bound to y as well
x.append(None) # None is *appended* to the list object bound to `x`
print y # y is bound to the same list
x = 5 # x is *rebound* to a different object
print y # y remains bound to the list