这一篇看起来很基础,但很多人前期都会对它一知半解。等后面学到函数、条件判断、数据处理时,才发现它其实很常见。
前面你已经接触了不少类型。
整数 int浮点数 float字符串 str布尔值 bool
这些类型都很好理解。 不是数字,就是文字,不是真就是假。
可接下来会遇到一个有点特别的东西:
None
很多新手第一次看到它,都会有点迷糊。
它是 0 吗 它是空字符串吗 它是 False 吗 它到底算不算一种值
答案是,都不是。
None 是 Python 里一个非常特殊的值。 它通常表示:
没有值 还没有内容 什么都没有 暂时不存在
这篇文章,我们就把 None 彻底讲清楚。
一、先别把 None 想复杂
先说最直白的理解。
你可以把 None 理解成:
空着 没有 暂时什么都不是
比如你准备记录一个人的手机号,但现在还没填。 这时候你可以先让它是 None。
phone = Noneprint(phone)
运行结果:
None
这就表示:
这个变量有名字 但现在还没有真正的数据内容
这和变量没定义,不是一回事。
二、None 不是没定义,而是“已经定义了,但值为空”
这个区别非常重要。
比如下面这段代码:
print(name)
如果你前面根本没定义过 name,程序通常会报错。 因为它根本不知道 name 是谁。
但如果你这样写:
name = Noneprint(name)
程序不会报错。 它会正常输出:
None
这说明什么。
说明变量已经存在了。 只是它当前保存的是一个特殊值 None。
所以你一定要分清:
没定义 和 定义了但值是 None
这是两件完全不同的事。
三、你可以把 None 理解成一个“占位符”
这个思路特别好理解。
有时候你知道将来这里要放一个值, 但现在还没有。 那你就可以先用 None 占着。
比如:
name = Noneage = Nonescore = Noneprint(name)print(age)print(score)
这些变量都已经存在了。 只是暂时没有真正内容。
以后你再给它们赋值:
name = '小明'age = 18score = 95
就可以了。
所以 None 很像一个空位。 这个位置已经留出来了, 只是还没正式填内容。
四、None 不是 0,也不是空字符串
这是最容易混淆的地方之一。
很多新手会觉得:
没有东西 那是不是就是 0 或者是不是就是 ''
其实不是。
来看对比:
a = Noneb = 0c = ''d = Falseprint(a)print(b)print(c)print(d)
输出大概会是:
None0False
它们看起来都像“空一点”, 但本质完全不同。
None 表示没有值0 是数字零'' 是空字符串False 是布尔假值
它们不是一回事。
你再用 type() 看一下就更清楚了:
a = Noneb = 0c = ''d = Falseprint(type(a))print(type(b))print(type(c))print(type(d))
你会看到它们类型都不同。
五、None 也有自己的类型
这一点很多人会忽略。
先看代码:
value = Noneprint(type(value))
运行结果通常是:
<class 'NoneType'>
这说明 None 不是随便的一个空写法, 它在 Python 里是有自己独立类型的。
这个类型就叫:
NoneType
你现在不需要死记这个名字, 只要知道一件事就够了:
None 是 Python 里正式存在的特殊值, 不是某种模糊状态。
六、什么时候会主动用到 None
第一个场景,先占位置,后面再赋值。
比如:
user_name = Noneprint('当前用户名是:', user_name)user_name = 'admin'print('更新后用户名是:', user_name)
这类写法很常见。 尤其是你一开始还不知道具体值,但变量位置已经需要留出来时。
第二个场景,表示“目前没有结果”。
比如你在写一个程序,想找某个数据。 如果找到了,就赋真正的值。 如果没找到,就先保持 None。
第三个场景,表示“可选内容还没填”。
比如:
手机号还没录入 邮箱还没填写 备注暂时为空 头像地址还没设置
这些场景都很适合用 None 表示。
七、自己动手做一个最简单的 None 练习
你可以新建一个文件,输入下面代码:
name = Nonephone = Noneprint(name)print(phone)name = '小红'phone = '13800138000'print(name)print(phone)
运行以后,你会看到变量先是 None, 后来又变成了真正的内容。
这个练习很简单,但特别值得做。 因为它能帮你建立一个感觉:
None 不是报错 也不是没定义 它是一个可以被后续值替换的特殊状态
八、None 和输入结合起来怎么理解
比如你想写一个最简单的信息录入逻辑。
一开始还没输入前:
name = None
等用户输入以后:
name = input('请输入姓名:')
完整一点可以这样写:
name = Noneprint('输入前:', name)name = input('请输入姓名:')print('输入后:', name)
这时候你就会很直观地看到:
最开始没有内容 后来得到用户输入 变量从 None 变成了真正的字符串
这就是 None 在程序里的一个非常典型的意义。
九、None 在条件判断里也很常见
虽然你还没正式进入 if 语句的大篇章, 但这里先建立一点感觉很有必要。
比如:
result = Noneprint(result == None)
结果通常是:
True
因为 result 当前确实就是 None。
再比如:
result = '查询成功'print(result == None)
结果就是:
False
所以很多时候,程序会先看一个变量是不是 None, 来判断它当前到底有没有值。
这个思路后面会非常常见。
十、很多函数在某些情况下也会返回 None
这一点先给你留个印象。
你后面学函数时会更系统地理解, 但现在先知道也很好。
有些函数并不会返回真正的数据结果, 它们返回的就是 None。
比如某些操作只是完成一个动作, 而不是产生一个新值。 这时候你就可能看到 None。
你现在不用急着深究函数返回值。 先知道:
None 不只是你手动写出来的 程序运行过程中,它自己也可能出现
这就够了。
十一、None 和空字符串有什么区别
这个一定要专门讲一下。
空字符串是:
''
它表示字符串类型里的“空内容”。
比如:
text = ''print(text)print(type(text))
这是一个字符串。 只是里面没有字符。
而 None 是:
value = Noneprint(value)print(type(value))
它不是字符串。 它表示根本没有值。
你可以这样理解:
'' 是一个空盒子,但盒子这个类型还在None 是连盒子里的东西都还没有准备好
所以以后你不要把它们混着用。
十二、None 和 0 有什么区别
再看另一个高频混淆对象。
a = Noneb = 0print(a)print(b)print(type(a))print(type(b))
这里:
None 表示没有值0 表示数字零
比如考试分数为 0 分, 这并不代表“没有分数”, 而是“分数就是零”。
这时候你应该用:
score = 0
而不是:
score = None
因为它们意义完全不同。
0 是确定结果None 是没有结果
这个差别一定要尽早建立起来。
十三、None 和 False 也不是一回事
再看一个经常被混在一起的。
a = Noneb = Falseprint(a)print(b)print(type(a))print(type(b))
False 是布尔值,表示假。None 是特殊空值,表示没有。
比如:
登录失败 可能用 False
还没开始判断登录 可能是 None
这两个在程序语义上差别很大。
所以你以后写代码时,要问清楚自己:
我这里要表达的是“假” 还是“还没有值”
这不是一个意思。
十四、什么时候更适合用 None
这个问题很实用。
如果你要表达的是“当前还没有数据”, 优先考虑 None。
比如:
avatar = Noneemail = Noneremark = None
如果你要表达的是“有数据,只是它恰好是空的或者为零”, 那就不要用 None。
比如:
score = 0message = ''is_login = False
你会发现,这背后其实是在表达不同含义。
没有 为空 为零 为假
这些看起来都像“不太有东西”, 但在程序里是四种不同状态。
十五、自己做一个“信息尚未完善”的小练习
这个练习特别适合现在做。
name = '小明'phone = Noneemail = Noneprint('------ 用户信息 ------')print(f'姓名:{name}')print(f'手机号:{phone}')print(f'邮箱:{email}')
运行一下,你会发现程序并不会报错, 它会很老实地把 None 显示出来。
然后你再给它们补上内容:
name = '小明'phone = Noneemail = Nonephone = '13800138000'email = 'test@example.com'print('------ 用户信息 ------')print(f'姓名:{name}')print(f'手机号:{phone}')print(f'邮箱:{email}')
你会更直观地理解 None 就是“暂时空着”。
十六、None 在程序设计里为什么很有用
因为现实世界里,很多信息不是一开始就完整的。
比如:
用户刚注册,还没填头像 订单刚创建,还没付款 快递刚下单,还没发货 考试成绩还没出来 搜索结果还没找到
这些状态都很正常。 程序不能要求一开始什么都完整。
所以 None 的意义就在这里。
它让你可以非常明确地表示:
这里先空着 这里还没有结果 这里暂时不存在具体值
这会让程序状态表达得更清楚。
十七、你现在就可以理解的一个简单场景
比如你想写一个“查找学生成绩”的简化版逻辑。
先假设还没查到:
score = Noneprint('当前成绩:', score)
后来查到了:
score = 92print('更新后的成绩:', score)
完整一点:
score = Noneprint('查询前成绩:', score)score = 92print('查询后成绩:', score)
这里的 None 非常自然。 因为在真正查到之前,成绩就是“还没有结果”。
十八、None 也可以和类型转换放在一起思考
前面你刚学完类型转换, 这里正好可以补一个很实用的意识。
并不是所有值都适合直接转换。
比如:
value = None
这时候你如果随便拿它去做数字计算、字符串拼接、大小比较, 很多时候都不太合适。
这说明什么。
说明你写程序时,不能只盯着变量名, 还要关心变量当前到底是什么状态。
它是整数 是字符串 是浮点数 还是 None
这会直接影响后面的处理方式。
这个意识后面会越来越重要。
十九、None 最容易让新手误会的地方
第一个误会,觉得 None 就等于没定义。
不是。 定义了,但值是 None,和没定义是两码事。
第二个误会,觉得 None 就等于 0。
不是。 0 是数字零,None 是没有值。
第三个误会,觉得 None 就等于空字符串。
不是。 空字符串还是字符串,None 不是字符串。
第四个误会,觉得 None 没什么用。
其实非常有用。 尤其当你开始处理“尚未填写”“暂时没有”“查找失败”“等待结果”这些场景时,它会非常自然。
二十、自己动手做一个状态变化练习
下面这个小练习,建议你亲手敲一遍。
order_status = Noneprint('订单初始状态:', order_status)order_status = '待付款'print('订单更新后状态:', order_status)order_status = '已付款'print('订单再次更新后状态:', order_status)
这个练习看起来很简单, 但特别适合帮助你理解:
None 可以表示一个流程开始前的空状态 然后随着程序推进,再逐渐变成真正的内容
这就是它很实用的地方。
二十一、再做一个“可选信息录入”的小练习
这个也很贴近真实场景。
name = input('请输入姓名:')phone = Noneremark = Noneprint('------ 初始信息 ------')print(f'姓名:{name}')print(f'手机号:{phone}')print(f'备注:{remark}')
然后你自己再升级一下:
name = input('请输入姓名:')phone = Noneremark = Nonephone = input('请输入手机号:')remark = input('请输入备注:')print('------ 完整信息 ------')print(f'姓名:{name}')print(f'手机号:{phone}')print(f'备注:{remark}')
前后对比一下,你会更清楚:
None 很适合表示还没填的状态。
二十二、今天一定要亲手完成的 3 个小练习
第一个,观察 None 类型。
value = Noneprint(value)print(type(value))
第二个,对比 None、0、空字符串、False。
a = Noneb = 0c = ''d = Falseprint(type(a))print(type(b))print(type(c))print(type(d))
第三个,做一个先空后填的练习。
email = Noneprint(email)email = 'hello@example.com'print(email)
这三个练习虽然都不复杂, 但非常值得你亲手做一下。
二十三、写在最后
None 这个知识点,刚接触时很容易被当成一个小细节。 因为它既不像数字那样能算, 也不像字符串那样直观。
可实际上,它在程序里非常重要。
因为现实世界里,本来就有大量“暂时没有”“还未确定”“等待结果”的状态。 程序如果不能清楚表达这些状态,很多逻辑就会变得很别扭。
所以你现在最需要建立的,不是去死记 NoneType 这种名字, 而是先形成一个很朴素的感觉:
这里到底是没有值 还是值刚好为 0 还是值刚好为空字符串 还是结果是假
把这几种状态分清楚, 你的代码表达能力会一下子提升很多。
本文小结
None 是 Python 里的一个特殊值,表示没有值、暂时为空、尚未确定。None 不等于没定义,也不等于 0、空字符串或 False。 它有自己的类型,叫 NoneType。None 很适合表示“先占位置,后面再赋值”的场景。 理解 None 的关键,不是记概念,而是分清“没有值”和“值为空、为零、为假”之间的区别。
下篇预告
第 19 篇,我们继续讲一个很容易让新手混淆、但后面特别重要的细节。
is 和 == 到底有什么区别
很多人刚开始学时会把它们混着用,但实际上,它们判断的根本不是一回事。