首先明确Python中的变量和Java中的变量是有本质区别的,在Java中在变量声明的时候需要指定数据类型,然后像虚拟机中申请内存,这个内存的大小其实和数据类型相关,这就好像是一个盒子,这个盒子能装什么其实已经确定下来。但是在Python中却不是这样的,Python中的变量本质上是一个指针,每个指针的大小都一样,它可以指向任意的对象,它保存的是对一个对象的引用。它本身并不会存放对象,它只是代表一个标签,通过这个标签可以找到具体存放对象的地方。你也可以将变量理解为一个便利贴。

a = 1 或者 a = ‘abc’的过程: 先在内存中创建一个int对象或者str对象,然后他们的值是1和abc,然后将a这个便利贴到它们身上,之后你访问a就相当于是在访问它们,非常类似于对象的引用。Python的动态性就是因为它的所有的变量的大小都是一样的,都代表了一个指针。其变量赋值的过程是,先声明对象,然后再建立关联引用。

1
2
3
4
5
6
7
8
9
10
11
a = [1,2,3,4]
b = a
print(id(a), id(b)) # b和a对应的是同一个对象
print(a is b)
b.append(5)
print(a)

# 运行结果:
# 48842152 48842152
# True
# [1, 2, 3, 4, 5]