Python print() 打印多个变量时,可变对象和不可变对象的区别

先来看这段代码:

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)
相关推荐
FreakStudio42 分钟前
一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估
python·单片机·嵌入式·多线程·面向对象·并行计算·电子diy
qq_3659116042 分钟前
GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比
开发语言
Susea&2 小时前
数据结构初阶:队列
c语言·开发语言·数据结构
慕容静漪2 小时前
如何本地安装Python Flask并结合内网穿透实现远程开发
开发语言·后端·golang
ErizJ2 小时前
Golang|锁相关
开发语言·后端·golang
GOTXX2 小时前
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
开发语言·数据库·c++·qt·图形渲染·图形化界面·qt新手入门
搬砖工程师Cola2 小时前
<C#>在 .NET 开发中,依赖注入, 注册一个接口的多个实现
开发语言·c#·.net
巨龙之路2 小时前
Lua中的元表
java·开发语言·lua
徐行1103 小时前
C++核心机制-this 指针传递与内存布局分析
开发语言·c++
划水哥~3 小时前
Kotlin作用域函数
开发语言·kotlin