Python面试必问的30个问题,标准答案都在这里,直接背
文章目录
- 前言
- 一、Python基础必问(1-10题)
- 1. Python3.7之后普通dict已经有序,OrderedDict还有存在的必要吗?
- 2. 解释Python中的GIL(全局解释器锁),它为什么会存在?
- 3. Python中的深拷贝和浅拷贝有什么区别?
- 4. 什么是装饰器?请手写一个简单的计时装饰器
- 5. Python中的迭代器和生成器有什么区别?
- 6. 解释*args和**kwargs的作用
- 7. Python中的垃圾回收机制是什么?
- 8. 什么是闭包?闭包有什么优缺点?
- 9. Python中的==和is有什么区别?
- 10. 解释Python中的切片操作,以及步长为负数的情况
- 二、数据结构与算法高频(11-18题)
- 11. Python中的列表和元组有什么区别?
- 12. 如何在Python中实现一个栈和队列?
- 13. 字典的底层实现原理是什么?
- 14. 集合的底层实现是什么?集合和字典有什么关系?
- 15. 如何快速合并两个字典?
- 16. 什么是列表推导式?请举几个常用的例子
- 17. 如何去除列表中的重复元素?
- 18. 解释Python中的可变对象和不可变对象
- 三、面向对象核心考点(19-24题)
- 19. Python中的类和实例有什么区别?
- 20. 解释Python中的继承,以及多继承的MRO机制
- 21. 什么是多态?请举一个Python中的例子
- 22. 解释__init__和__new__方法的区别
- 23. Python中的私有变量和保护变量有什么区别?
- 24. 什么是元类?元类有什么作用?
- 四、进阶与工程化必问(25-30题)
- 25. Python中的异常处理机制是什么?try-except-finally的执行顺序
- 26. 解释Python中的模块和包,以及__init__.py的作用
- 27. Python中的多线程和多进程有什么区别?分别适用于什么场景?
- 28. 什么是协程?Python中如何实现协程?
- 29. Python3.12和3.13有哪些重要的新特性?
- 30. 你在Python开发中遇到过哪些常见的坑?如何避免?
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
前言
兄弟们,先问个扎心的问题:你刷了几百道Python面试题,背了三天三夜的八股文,结果一到面试现场,面试官一个“Python3.7之后普通dict已经有序了,OrderedDict还有必要吗?”直接给你干懵了?
我搞了22年AI,面过的候选人没有一千也有八百,最近2026年春招帮不少朋友内推,见了太多离谱的情况:有个小伙子刷了LeetCode 1200多道题,号称“刷题狂魔”,结果一面第一题被问“Python中的深拷贝和浅拷贝有什么区别”,支支吾吾说了半天,连可变对象和不可变对象都没分清楚;还有个做了3年AI算法的老哥,天天写Python代码调模型,结果被问“什么是GIL”,直接说“不知道,反正不影响我写代码”,当场就被面试官pass了。
很多人觉得Python简单,不就是写个print、定义个函数吗?但实际上,Python的水很深,尤其是面试的时候,面试官专挑那些你天天用但从来没深究过的点来问。今天我就把2026年Python面试最高频的30个问题整理出来,每个问题都给你标准答案,直接背就能用,保证你面试的时候再也不会被问得哑口无言。
一、Python基础必问(1-10题)
1. Python3.7之后普通dict已经有序,OrderedDict还有存在的必要吗?
面试官想考什么:考察你对Python版本特性的了解,以及是否真的理解数据结构的设计初衷,而不是只会背“dict现在有序了”。
标准答案:有必要,两者的核心区别和适用场景不同:
- 功能差异:OrderedDict提供了普通dict没有的专属方法,比如
move_to_end(key, last=True)可以将指定键移到字典的开头或结尾,popitem(last=True)可以按顺序弹出字典的第一个或最后一个元素,这些方法在实现LRU缓存、有序队列等场景时非常方便。 - 语义明确性:OrderedDict的存在本身就明确表达了“顺序很重要”的语义,当你需要强调字典的有序性时,使用OrderedDict会让代码更易读、更易维护。
- 兼容性:如果你的代码需要运行在Python3.7之前的环境中,OrderedDict是唯一的有序字典选择。
- 相等性判断:两个OrderedDict相等不仅要求键值对相同,还要求顺序相同;而两个普通dict相等只要求键值对相同,与顺序无关。
2. 解释Python中的GIL(全局解释器锁),它为什么会存在?
面试官想考什么:考察你对Python底层执行机制的理解,这是Python面试最经典的问题,没有之一。
标准答案:GIL(Global Interpreter Lock,全局解释器锁)是CPython解释器的一个特性,它保证了同一时刻只有一个线程执行Python字节码。
GIL存在的根本原因是CPython的内存管理不是线程安全的。Python使用引用计数来管理内存,每个对象都有一个引用计数,当引用计数为0时,对象就会被回收。如果没有GIL,多个线程同时修改同一个对象的引用计数,就会导致引用计数错误,进而造成内存泄漏或者对象被错误回收。
打个比方,GIL就像一条单车道的高速路,不管你有多少辆车(线程),同一时间只能有一辆车在这条路上跑。所以对于CPU密集型任务,多线程并不能提高效率,反而会因为线程切换带来额外的开销;但对于IO密集型任务(比如网络请求、文件读写),多线程可以让一个线程在等待IO的时候,让其他线程执行,从而提高效率。
3. Python中的深拷贝和浅拷贝有什么区别?
面试官想考什么:考察你对Python内存模型的理解,这是很多新手最容易搞混的点。
标准答案:
- 浅拷贝:创建一个新的对象,但新对象中的元素仍然是原对象中元素的引用。也就是说,浅拷贝只拷贝了对象的“外壳”,里面的内容还是共享的。
- 深拷贝:创建一个新的对象,并且递归地拷贝原对象中的所有元素,包括嵌套的对象。也就是说,深拷贝会完全复制原对象的所有内容,新对象和原对象之间没有任何共享的部分。
举个例子:
importcopy a=[1,2,[3,4]]b=copy.copy(a)# 浅拷贝c=copy.deepcopy(a)# 深拷贝a[0]=100a[2][0]=300print(a)# [100, 2, [300, 4]]print(b)# [1, 2, [300, 4]] 浅拷贝的嵌套列表被修改了print(c)# [1, 2, [3, 4]] 深拷贝的嵌套列表没有被修改4. 什么是装饰器?请手写一个简单的计时装饰器
面试官想考什么:考察你对Python高阶函数和闭包的理解,装饰器是Python中最常用的高级特性之一。
标准答案:装饰器本质上是一个高阶函数,它接收一个函数作为参数,返回一个新的函数,在不修改原函数代码的情况下,为原函数添加额外的功能。
手写计时装饰器:
importtimeimportfunctoolsdeftimer(func):@functools.wraps(func)# 保留原函数的元信息defwrapper(*args,**kwargs):start_time=time.time()result=func(*args,**kwargs)end_time=time.time()print(f"函数{func.__name__}执行时间:{end_time-start_time:.4f}秒")returnresultreturnwrapper# 使用装饰器@timerdeftest():time.sleep(1)print("test函数执行完毕")test()装饰器就像奶茶加料,你点一杯原味奶茶(原函数),装饰器就是给你加珍珠、加椰果、加冰,不改变奶茶本身的味道,但是增加了新的口感和功能。
5. Python中的迭代器和生成器有什么区别?
面试官想考什么:考察你对Python迭代协议的理解,这是Python中处理大数据集的核心知识点。
标准答案:
- 迭代器:是一个实现了
__iter__和__next__方法的对象,它可以逐个返回元素。迭代器的特点是惰性求值,只有当调用__next__方法时,才会计算并返回下一个元素。 - 生成器:是一种特殊的迭代器,它使用
yield关键字来返回元素。生成器不需要显式地实现__iter__和__next__方法,Python会自动为生成器函数创建迭代器对象。
两者的核心区别:
- 实现方式不同:迭代器需要手动实现
__iter__和__next__方法,生成器使用yield关键字即可实现。 - 代码简洁性不同:生成器的代码比迭代器更简洁、更易读。
- 内存占用不同:生成器和迭代器都是惰性求值,内存占用都很低,但生成器的实现更高效。
6. 解释*args和**kwargs的作用
面试官想考什么:考察你对Python函数参数的理解,这是Python函数最基础也是最常用的知识点。
标准答案:
*args:用于接收任意数量的位置参数,它会将多余的位置参数打包成一个元组。**kwargs:用于接收任意数量的关键字参数,它会将多余的关键字参数打包成一个字典。
举个例子:
deffunc(*args,**kwargs):print("位置参数:",args)print("关键字参数:",kwargs)func(1,2,3,name="张三",age=20)# 输出:# 位置参数: (1, 2, 3)# 关键字参数: {'name': '张三', 'age': 20}7. Python中的垃圾回收机制是什么?
面试官想考什么:考察你对Python内存管理的理解,这是进阶开发者必须掌握的知识点。
标准答案:Python的垃圾回收机制主要包括三个部分:
- 引用计数:这是Python最主要的垃圾回收机制。每个对象都有一个引用计数,当引用计数为0时,对象就会被回收。
- 标记-清除:用于解决循环引用的问题。当两个对象互相引用时,它们的引用计数永远不会为0,这时候就需要标记-清除算法来回收这些对象。
- 分代回收:将对象分为年轻代、中年代和老年代三个代,对象存活的时间越长,被回收的概率就越低。分代回收可以提高垃圾回收的效率,因为大部分对象都是短命的。
8. 什么是闭包?闭包有什么优缺点?
面试官想考什么:考察你对Python函数作用域的理解,闭包是装饰器的基础。
标准答案:闭包是指在一个内部函数中,引用了外部函数作用域中的变量,并且外部函数返回了这个内部函数。闭包的特点是内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。
闭包的优点:
- 可以保留函数的状态,让变量在函数执行完毕后仍然存在。
- 可以实现数据封装,隐藏内部实现细节。
闭包的缺点:
- 由于闭包会引用外部函数的变量,所以这些变量不会被垃圾回收,可能会导致内存泄漏。
- 闭包的使用不当会让代码变得难以理解和调试。
9. Python中的==和is有什么区别?
面试官想考什么:考察你对Python对象身份和值的理解,这是很多新手最容易踩的坑。
标准答案:
==:比较的是两个对象的值是否相等。is:比较的是两个对象的身份是否相等,也就是它们是否是同一个对象,即内存地址是否相同。
举个例子:
a=[1,2,3]b=[1,2,3]c=aprint(a==b)# True 值相等print(aisb)# False 不是同一个对象print(aisc)# True 是同一个对象注意:对于小整数(-5到256)和字符串常量,Python会进行缓存,所以它们的is比较可能会返回True。
10. 解释Python中的切片操作,以及步长为负数的情况
面试官想考什么:考察你对Python列表操作的掌握程度,切片是Python中最常用的列表操作之一。
标准答案:切片操作的语法是[start:end:step],其中:
start:切片的起始索引,默认为0。end:切片的结束索引,不包含该索引对应的元素,默认为列表的长度。step:切片的步长,默认为1。
当步长为负数时,切片会从右往左进行。例如:
a=[1,2,3,4,5]print(a[::-1])# [5, 4, 3, 2, 1] 反转列表print(a[3:0:-1])# [4, 3, 2] 从索引3到索引1,从右往左二、数据结构与算法高频(11-18题)
11. Python中的列表和元组有什么区别?
面试官想考什么:考察你对Python基本数据结构的理解,这是Python面试最基础的问题。
标准答案:
| 特性 | 列表(list) | 元组(tuple) |
|---|---|---|
| 可变性 | 可变 | 不可变 |
| 语法 | 用[]表示 | 用()表示 |
| 性能 | 读写性能稍差 | 读写性能更好 |
| 哈希性 | 不可哈希 | 可哈希(当元素都是不可变对象时) |
| 适用场景 | 存储需要修改的数据 | 存储不需要修改的数据,作为字典的键 |
12. 如何在Python中实现一个栈和队列?
面试官想考什么:考察你对基本数据结构的理解和实现能力。
标准答案:
- 栈:栈是一种后进先出(LIFO)的数据结构,可以用列表来实现:
stack=[]stack.append(1)# 入栈stack.append(2)print(stack.pop())# 出栈 2print(stack.pop())# 出栈 1 - 队列:队列是一种先进先出(FIFO)的数据结构,推荐使用
collections.deque来实现,因为它的popleft方法时间复杂度是O(1),而列表的pop(0)方法时间复杂度是O(n):fromcollectionsimportdeque queue=deque()queue.append(1)# 入队queue.append(2)print(queue.popleft())# 出队 1print(queue.popleft())# 出队 2
13. 字典的底层实现原理是什么?
面试官想考什么:考察你对Python底层数据结构的理解,这是Python面试的高频难点。
标准答案:Python3.7之后,字典的底层实现是基于哈希表的,并且采用了“分离链接法”来解决哈希冲突。
字典的核心结构是一个哈希表,哈希表中的每个元素是一个键值对。当插入一个键值对时,Python会先计算键的哈希值,然后根据哈希值计算出在哈希表中的索引位置。如果该位置已经有元素了,就会使用分离链接法,将新元素插入到该位置的链表中。
Python3.7对字典的实现进行了重大优化,现在的字典不仅有序,而且内存占用比之前减少了约20%。
14. 集合的底层实现是什么?集合和字典有什么关系?
面试官想考什么:考察你对Python集合和字典底层实现的理解。
标准答案:集合的底层实现和字典几乎是一样的,都是基于哈希表。集合可以看作是一个只有键没有值的字典,集合中的元素就是字典的键。
因此,集合和字典有很多相似的特性:
- 元素都是唯一的,不允许重复。
- 元素都必须是可哈希的。
- 插入、删除、查找的时间复杂度都是O(1)。
15. 如何快速合并两个字典?
面试官想考什么:考察你对Python版本特性的了解,以及是否掌握高效的编程技巧。
标准答案:Python3.9之后,提供了|运算符和|=运算符来合并字典:
a={"name":"张三","age":20}b={"gender":"男","age":21}c=a|b# 合并a和b,b中的键会覆盖a中的键print(c)# {'name': '张三', 'age': 21, 'gender': '男'}a|=b# 原地合并a和bprint(a)# {'name': '张三', 'age': 21, 'gender': '男'}在Python3.9之前,可以使用dict.update()方法或者字典解包来合并字典:
c={**a,**b}a.update(b)16. 什么是列表推导式?请举几个常用的例子
面试官想考什么:考察你是否掌握Python的简洁编程风格,列表推导式是Python中最常用的语法糖之一。
标准答案:列表推导式是一种简洁的创建列表的方式,它可以用一行代码代替多行的for循环。
常用例子:
- 生成1到10的平方列表:
squares=[x**2forxinrange(1,11)] - 过滤出列表中的偶数:
evens=[xforxinrange(1,11)ifx%2==0] - 嵌套列表推导式,将二维列表展平:
matrix=[[1,2,3],[4,5,6],[7,8,9]]flat=[xforrowinmatrixforxinrow]
17. 如何去除列表中的重复元素?
面试官想考什么:考察你对Python数据结构的灵活运用能力。
标准答案:
- 如果不需要保持顺序,可以直接将列表转换为集合,再转换回列表:
a=[1,2,3,2,1,4]b=list(set(a)) - 如果需要保持顺序,可以使用
dict.fromkeys()方法(Python3.7+):a=[1,2,3,2,1,4]b=list(dict.fromkeys(a)) - 也可以使用列表推导式来实现:
a=[1,2,3,2,1,4]b=[]forxina:ifxnotinb:b.append(x)
18. 解释Python中的可变对象和不可变对象
面试官想考什么:考察你对Python内存模型的理解,这是很多Python坑的根源。
标准答案:
- 可变对象:对象创建后,其内容可以被修改。常见的可变对象有列表、字典、集合。
- 不可变对象:对象创建后,其内容不能被修改。常见的不可变对象有整数、字符串、元组。
注意:对于不可变对象,当你修改它的时候,实际上是创建了一个新的对象,而不是修改原来的对象。例如:
a="hello"a+=" world"# 这里实际上是创建了一个新的字符串"hello world",并将a指向这个新字符串# 原来的字符串"hello"并没有被修改三、面向对象核心考点(19-24题)
19. Python中的类和实例有什么区别?
面试官想考什么:考察你对面向对象基本概念的理解。
标准答案:
- 类:是对一类具有相同属性和方法的对象的抽象,是创建实例的模板。
- 实例:是类的具体实现,是根据类创建出来的具体对象。
打个比方,类就像一张汽车设计图,实例就是根据这张设计图生产出来的具体的汽车。一张设计图可以生产出很多辆汽车,每辆汽车都有自己的颜色、型号等属性,也都有启动、刹车等方法。
20. 解释Python中的继承,以及多继承的MRO机制
面试官想考什么:考察你对面向对象继承的理解,以及Python多继承的特点。
标准答案:继承是指一个类可以继承另一个类的属性和方法,从而实现代码的复用。被继承的类称为父类或基类,继承的类称为子类或派生类。
Python支持多继承,一个子类可以继承多个父类。多继承会带来一个问题:当多个父类有同名的方法时,子类应该继承哪个父类的方法?这就需要MRO(Method Resolution Order,方法解析顺序)机制来解决。
Python3中的MRO采用的是C3算法,它保证了方法解析顺序的唯一性和一致性。你可以使用类名.__mro__来查看类的方法解析顺序。
21. 什么是多态?请举一个Python中的例子
面试官想考什么:考察你对面向对象多态的理解。
标准答案:多态是指同一个方法调用,由于对象不同,可能会产生不同的行为。多态的核心是“一个接口,多种实现”。
举个例子:
classAnimal:defspeak(self):passclassDog(Animal):defspeak(self):print("汪汪汪")classCat(Animal):defspeak(self):print("喵喵喵")defmake_speak(animal):animal.speak()dog=Dog()cat=Cat()make_speak(dog)# 汪汪汪make_speak(cat)# 喵喵喵在这个例子中,make_speak函数接收一个Animal类型的参数,但是它并不知道这个参数具体是Dog还是Cat,它只需要调用speak方法即可,不同的对象会有不同的行为,这就是多态。
22. 解释__init__和__new__方法的区别
面试官想考什么:考察你对Python类构造方法的理解,这是面向对象的难点之一。
标准答案:
__new__:是类的构造方法,用于创建对象。它是一个静态方法,第一个参数是cls,返回值是创建的对象实例。__init__:是类的初始化方法,用于初始化对象。它是一个实例方法,第一个参数是self,没有返回值。
__new__方法在__init__方法之前执行,__new__方法创建对象,__init__方法初始化对象。一般情况下,我们不需要重写__new__方法,只有当我们需要控制对象的创建过程时,才需要重写它。
23. Python中的私有变量和保护变量有什么区别?
面试官想考什么:考察你对Python类访问控制的理解。
标准答案:
- 私有变量:以两个下划线开头的变量,例如
__name。Python会对私有变量进行名称改写,将其变成_类名__name,从而实现私有访问。私有变量只能在类的内部访问,不能在类的外部直接访问。 - 保护变量:以一个下划线开头的变量,例如
_name。保护变量只是一种约定俗成的命名规范,它表示这个变量应该被视为私有变量,不应该在类的外部直接访问,但实际上Python并没有强制限制它的访问。
24. 什么是元类?元类有什么作用?
面试官想考什么:考察你对Python元编程的理解,这是Python面向对象的高级知识点。
标准答案:元类是用于创建类的类。在Python中,一切皆对象,类也是一个对象,它是由元类创建的。默认情况下,Python中所有的类都是由type元类创建的。
元类的作用是控制类的创建过程,你可以通过自定义元类来修改类的属性、方法,或者实现一些特殊的功能,比如单例模式、ORM框架等。
四、进阶与工程化必问(25-30题)
25. Python中的异常处理机制是什么?try-except-finally的执行顺序
面试官想考什么:考察你对Python异常处理的掌握程度,这是工程化开发中必须掌握的知识点。
标准答案:Python的异常处理机制使用try-except-finally语句来捕获和处理异常:
try块:包含可能会抛出异常的代码。except块:用于捕获并处理异常。可以有多个except块,分别处理不同类型的异常。finally块:无论是否发生异常,都会执行的代码。通常用于释放资源,比如关闭文件、关闭数据库连接等。
执行顺序:
- 执行
try块中的代码。 - 如果没有发生异常,跳过
except块,执行finally块中的代码。 - 如果发生异常,根据异常类型匹配对应的
except块,执行except块中的代码,然后执行finally块中的代码。 - 如果没有匹配到对应的
except块,异常会向上抛出,直到被捕获或者程序终止。
26. 解释Python中的模块和包,以及__init__.py的作用
面试官想考什么:考察你对Python工程化组织的理解。
标准答案:
- 模块:一个
.py文件就是一个模块,模块中可以定义函数、类、变量等。 - 包:是一个包含多个模块的目录,目录中必须有一个
__init__.py文件(Python3.3之后可以没有,但建议保留)。
__init__.py的作用:
- 标识该目录是一个Python包。
- 可以在
__init__.py中定义包的公共接口,导入需要暴露的模块和函数,方便用户使用。 - 可以在
__init__.py中执行一些初始化操作,比如加载配置、初始化数据库连接等。
27. Python中的多线程和多进程有什么区别?分别适用于什么场景?
面试官想考什么:考察你对Python并发编程的理解,这是进阶开发者必须掌握的知识点。
标准答案:
| 特性 | 多线程 | 多进程 |
|---|---|---|
| 资源占用 | 资源占用少,切换开销小 | 资源占用多,切换开销大 |
| 通信方式 | 共享内存,需要加锁保证线程安全 | 进程间通信(IPC),比如管道、消息队列、共享内存 |
| GIL影响 | 受GIL限制,同一时刻只有一个线程执行Python字节码 | 不受GIL限制,每个进程有自己独立的GIL |
| 适用场景 | IO密集型任务,比如网络请求、文件读写 | CPU密集型任务,比如科学计算、图像处理 |
28. 什么是协程?Python中如何实现协程?
面试官想考什么:考察你对Python异步编程的理解,这是2026年Python面试的热点问题。
标准答案:协程是一种用户态的轻量级线程,它的切换由用户自己控制,而不是由操作系统内核控制。协程的切换开销非常小,因此可以实现高并发。
Python中实现协程的方式主要有:
- 使用
async/await关键字(Python3.5+),这是目前最推荐的方式。 - 使用
gevent库。 - 使用
asyncio库,它是Python标准库中提供的异步IO框架。
举一个简单的协程例子:
importasyncioasyncdefhello():print("Hello")awaitasyncio.sleep(1)print("World")asyncdefmain():awaitasyncio.gather(hello(),hello(),hello())asyncio.run(main())29. Python3.12和3.13有哪些重要的新特性?
面试官想考什么:考察你对Python最新版本特性的了解,这体现了你对技术的关注度。
标准答案:
Python3.12(2023年10月发布):
- 性能提升:解释器的整体性能提升了约5%。
- 更简洁的语法:支持在f-string中使用引号,例如
f"Hello {name}"。 - 更好的错误提示:错误信息更加详细和友好。
- 支持泛型类型参数的默认值。
Python3.13(2024年10月发布):
- 自由线程构建:实验性地支持移除GIL,实现真正的多线程并行。
- 进一步的性能提升:解释器的性能比Python3.12又提升了约10%。
- 更好的异步IO支持:优化了
asyncio库的性能和稳定性。 - 新的标准库模块:增加了一些新的标准库模块,比如
tomllib用于解析TOML文件。
30. 你在Python开发中遇到过哪些常见的坑?如何避免?
面试官想考什么:考察你的实际开发经验,以及是否善于总结和反思。
标准答案:
可变默认参数坑:函数的默认参数在函数定义时只计算一次,如果默认参数是可变对象,多次调用函数会共享这个对象。
避免方法:使用None作为默认参数,在函数内部创建可变对象。# 错误写法deffunc(a=[]):a.append(1)print(a)# 正确写法deffunc(a=None):ifaisNone:a=[]a.append(1)print(a)循环变量绑定坑:在循环中创建lambda函数时,lambda函数会绑定循环变量,而不是循环变量的当前值。
避免方法:使用默认参数来捕获循环变量的当前值。# 错误写法funcs=[lambda:xforxinrange(3)]forfinfuncs:print(f())# 输出2 2 2# 正确写法funcs=[lambdax=x:xforxinrange(3)]forfinfuncs:print(f())# 输出0 1 2整数缓存坑:Python会缓存-5到256之间的整数,所以这些整数的
is比较会返回True,但超出这个范围的整数is比较会返回False。
避免方法:比较整数的值时,始终使用==而不是is。
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
