当前位置:首页>python>《Python 从入门到精通》018 | 认识 None:Python 里“什么都没有”是什么

《Python 从入门到精通》018 | 认识 None:Python 里“什么都没有”是什么

  • 2026-09-02 19:10:24
《Python 从入门到精通》018 | 认识 None:Python 里“什么都没有”是什么

这一篇看起来很基础,但很多人前期都会对它一知半解。等后面学到函数、条件判断、数据处理时,才发现它其实很常见。

前面你已经接触了不少类型。

整数 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 和 == 到底有什么区别

很多人刚开始学时会把它们混着用,但实际上,它们判断的根本不是一回事。

最新文章

随机文章