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)
相关推荐
oioihoii2 分钟前
C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)
开发语言·c++·c++23
Xudde.4 分钟前
加速pip下载:永久解决网络慢问题
网络·python·学习·pip
免檒4 分钟前
go基于redis+jwt进行用户认证和权限控制
开发语言·redis·golang
兆。9 分钟前
电子商城后台管理平台-Flask Vue项目开发
前端·vue.js·后端·python·flask
未名编程19 分钟前
LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释
python·算法·leetcode
没有梦想的咸鱼185-1037-166329 分钟前
全球森林数据如何分析?基于R语言森林生态系统结构、功能与稳定性分析与可视化
开发语言·随机森林·数据分析·r语言
Your易元32 分钟前
设计模式-迭代器模式
java·开发语言
魔障阿Q34 分钟前
windows使用bat脚本激活conda环境
人工智能·windows·python·深度学习·conda
2401_8582861138 分钟前
CD37.【C++ Dev】string类的模拟实现(上)
开发语言·c++·算法
洋芋爱吃芋头41 分钟前
hadoop中的序列化和反序列化(3)
大数据·hadoop·python