Python和Java中变量的本质不一样. Java在定义变量的时候, 就已经确定了该变量的数据类型且不可改变. Python的变量实质上是一个指针, 指针本身的大小是固定的, 它可以指向一个int, 也可以指向str或其他任何数据类型. 在Python中查找数据, 只需要找到指针即可找到对应的数据. 可以简单把Python变量理解为一个标签, 这个标签的大小是固定的, 标签可以贴在任何对象上
创建变量的过程
1 | a = 1 |
- 首先, 在内存中声明一个int对象, 用来放数据
- 然后给对象贴上标签
注意: 对于Python来说, 是a
标签贴在了对象上, 而不是将对象分配给a
. 在Java来说, 才是将对象分配到了a
的”盒子”里. “标签”是动态语言的核心
1 | a = [1, 2, 3] |
执行结果:
1 | [1, 2, 3, 4] |
可以看到, a标签贴在了一个列表对象上, 然后将b也贴在了这个列表上, 所以后面对b标签的操作, 实际也是在操作a标签下的数据, 因为a, b两个标签此时对应的是同一对象
此时可能有人会有疑问, 上面是引用数据类型, 如果我操作的是基本数据类型呢? 请看如下实验
1 | a = "abc" |
执行结果:
1 | 'abc' |
在第三行中, 我对字符串进行了替换操作, 为什么没有影响到最终的结果呢? 因为在字符串
.replace()的操作后, 会返回一个新的字符串对象, 该字符串对象才是符合预期修改的字符串, 该操作新生成了对象返回, 没有影响到原始对象的数据. 而且我们可以通过id()函数来观察
1 | id(a) |
执行结果:
1 | 4554176528 |
从执行结果可以看出, 即使对象是基础数据类型, a, b两个标签依然是贴在同一个对象上, 没有生成新的对象