先来看这段代码:
python
tmp = []
print(tmp, tmp.append(1), tmp)
输出:
python
[1] None [1]
并不是一些人认为的 [] None [1]
这是因为列表是可变对象,print()打印前会先计算出所有结果,最后再打印出来,中间在列表中添加了1,之前的 tmp 由于和之后的 tmp 是同一个列表对象,都会有1。
再来看不可变对象:
python
a = 1
print(a, a := 2, a)
输出:
python
1 2 2
并没有改变第一个 a 的值,这是因为不可变对象都有自己独一无二的地址,a:=2
时 a 已经是 2 这个不可变对象了,和 1 已经无关了,修改 a 不会影响前面的 a。
可以理解为 print() 打印之前会确定所有待打印对象的地址,可变对象则是可变对象的地址,例如 tmp 列表的地址(至于它的内容是什么等真的打印的时候再看);不可变对象则是不可变对象的地址,例如第一个 a 的地址是 1 的地址,就确定是 1 的地址了,第三个 a 的地址是 2 的地址,就确定是 2 的地址了,最后打印的时候找到它们的地址对应的内容,仍然是 1 和 2。
最后留下一道思考题:
python
def f():
global x
x = 2
return x
x = 1
print(x, f(), x)