Python中的变量的本质

Python和Java中变量的本质不一样. Java在定义变量的时候, 就已经确定了该变量的数据类型且不可改变. Python的变量实质上是一个指针, 指针本身的大小是固定的, 它可以指向一个int, 也可以指向str或其他任何数据类型. 在Python中查找数据, 只需要找到指针即可找到对应的数据. 可以简单把Python变量理解为一个标签, 这个标签的大小是固定的, 标签可以贴在任何对象上

创建变量的过程

1
2
a = 1
a = "abc"
  • 首先, 在内存中声明一个int对象, 用来放数据
  • 然后给对象贴上标签

注意: 对于Python来说, 是a标签贴在了对象上, 而不是将对象分配给a. 在Java来说, 才是将对象分配到了a的”盒子”里. “标签”是动态语言的核心

1
2
3
4
a = [1, 2, 3]
b = a
b.append(d)
print(a)

执行结果:

1
[1, 2, 3, 4]

可以看到, a标签贴在了一个列表对象上, 然后将b也贴在了这个列表上, 所以后面对b标签的操作, 实际也是在操作a标签下的数据, 因为a, b两个标签此时对应的是同一对象

此时可能有人会有疑问, 上面是引用数据类型, 如果我操作的是基本数据类型呢? 请看如下实验

1
2
3
4
5
a = "abc"
b = a
b.replace("c", "x")
print(a)
print(b)

执行结果:

1
2
'abc'
'abc'

在第三行中, 我对字符串进行了替换操作, 为什么没有影响到最终的结果呢? 因为在字符串.replace()的操作后, 会返回一个新的字符串对象, 该字符串对象才是符合预期修改的字符串, 该操作新生成了对象返回, 没有影响到原始对象的数据. 而且我们可以通过id()函数来观察

1
2
id(a)
id(b)

执行结果:

1
2
4554176528
4554176528

从执行结果可以看出, 即使对象是基础数据类型, a, b两个标签依然是贴在同一个对象上, 没有生成新的对象