是不是c,java语言有缺陷未考虑这点,脚本语言都这样吗js,shell,go
这和python标签对应变量名有关吗
Python 的“变量名”到底是什么?
2.1 官方定义
“Names are introduced by name binding operations... A name is a reference to an object.”
CPython 实现里,每个名字对应一个 PyObject* 指针,但语言层面你看不到这个指针,也改不了它,只能重新绑定(rebinding)。 示意图: 复制 栈帧 dict (locals) ┌--------┐ │ 'a' ---┼----┐ │ 'b' ---┼--┐ │ └--------┘ │ │ ▼ ▼ [1, 2, 3] (PyListObject*)
“可变 vs 不可变”与指针概念无关,但与绑定行为有关
x = 10
y = x
x += 1 # 新建 int 对象 11,x 重新绑定,y 仍绑定 10
lst = [1]
lst2 = lst
lst.append(2) # 对象原地修改,lst2 同步可见
int
是不可变对象,+=
产生新对象 → 重新绑定。list
是可变对象,append
改的是对象本身 → 所有别名看到同一变化。用完整代码把三件事放到一张图:C 指针、C++ 引用、Python 名字
is
为什么比 ==
快?”is
只比较两个 C 级指针值(PyObject*)是否相等;==
触发 Python 级方法调用,可能递归比较内容。