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)
相关推荐
大模型铲屎官4 分钟前
从过拟合到强化学习:机器学习核心知识全解析
人工智能·python·机器学习·llm·scikit-learn·强化学习·过拟合
萧萧玉树4 分钟前
设计模式-单一职责
开发语言·c++·设计模式
java1234_小锋5 分钟前
一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块
开发语言·前端·python·flask·flask3
forestsea7 分钟前
Java 8 Stream API:传统实现和流式编程的范式对比
java·开发语言
补三补四9 分钟前
网络爬虫【爬虫库urllib】
爬虫·python·网络爬虫
帅帅的Python10 分钟前
基于Python的tkinter开发的一个工具,解析图片文件名并将数据自动化导出为Excel文件
python·自动化·excel
MoLingDong16 分钟前
PyCharm中pyexecjs调用Node的救赎之路:当Anaconda与fnm狭路相逢
python·node.js
多多*21 分钟前
Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则
java·开发语言·数据库·macos·github·objective-c·cocoa
小林熬夜学编程27 分钟前
【高并发内存池】第一弹---深入解析内存池:项目介绍、原理及设计定长内存池全攻略
linux·服务器·c语言·开发语言·c++·算法
这里有鱼汤28 分钟前
解决Python路径问题:为什么你应该用 pathlib 替代 os.path
后端·python