一文总结10个Python新手最容易踩的语法坑

 更新时间:2026年06月11日 09:22:19   作者:长大1988  
很多人觉得 Python 语法简洁,上手快,但正是这种"简洁",藏了不少让人掉坑的细节,本文小编为大家整理了10个新手最容易踩的语法坑,希望对大家有所帮助

很多人觉得 Python 语法简洁,上手快。但正是这种"简洁",藏了不少让人掉坑的细节。以下 10 个坑,几乎每个新手都踩过至少一半。

1. 可变默认参数

python
def add(item, lst=[]):
    lst.append(item)
    return lst

print(add(1))  # [1]
print(add(2))  # [1, 2] ← 意外!

默认参数只在函数定义时求值一次,lst=[] 是同一个对象。正确写法:

python
def add(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst

2. 闭包延迟绑定

python
funcs = [lambda: i for i in range(5)]
print([f() for f in funcs])  # [4, 4, 4, 4, 4]

lambda 里的 i 不是"捕获值",而是"引用变量"。循环结束后 i=4,所以全返回 4。

修复lambda i=i: i,用默认参数锁住当前值。

3.isvs==

python
a = 256
b = 256
print(a is b)  # True(小整数池)

a = 257
b = 257
print(a is b)  # False!

is 比较的是内存地址== 才比较值。判断相等,永远用 ==is 只该用于和 None 比较(if x is None)。

4. 缩进导致的逻辑错误

python
def foo(x):
    if x > 0:
        print("正数")
    return "完成"  # 这个 return 不在 if 里

新手常以为缩进只是"格式",其实它是语法本身。Tab 和空格混用会直接报错,PEP 8 规定统一用 4 个空格。

5. 修改正在遍历的列表

python
nums = [1, 2, 3, 4]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)
print(nums)  # [1, 3] → 但如果是 [2,4,6,8] 会出问题

遍历中删除元素会导致索引错乱。正确做法:

python
nums = [n for n in nums if n % 2 != 0]
# 或
for n in nums[:]:  # 遍历副本

6. 字符串不可变,但变量名可以"变"

python
s = "hello"
s = s + " world"  # 不是在原字符串上改,而是创建了新对象

很多新手以为字符串拼接是"修改",其实每次都生成新对象。大量拼接时,用 ''.join(list) 或 f-string 性能好得多。

7. 浅拷贝 vs 深拷贝

python
import copy

a = [[1, 2], [3, 4]]
b = a.copy()        # 浅拷贝
b[0][0] = 999
print(a)  # [[999, 2], [3, 4]] ← 原列表也被改了!

c = copy.deepcopy(a)  # 深拷贝才真正独立

列表的 .copy()list()、切片 [:] 都是浅拷贝。嵌套结构必须用 copy.deepcopy()

8.except捕获范围太大

python
try:
    result = 10 / 0
except:  # 什么都捕获,包括系统退出信号
    print("出错了")

except 会捕获 KeyboardInterrupt,导致你按 Ctrl+C 都关不掉程序。始终写具体异常:

python
except ZeroDivisionError:
    print("除零了")

9. 字典键必须可哈希

python
d = {[1, 2]: "value"}  # TypeError: unhashable type: 'list'

列表、字典、集合都不能当字典的 key,因为它们可变。元组可以。

10.for...else和while...else

python
for i in range(5):
    if i == 10:
        break
else:
    print("循环正常结束")  # 会执行!

else 在循环没有被 break 打断时才执行。这个设计是故意的(用于搜索场景),但 90% 的新手第一次见到都会困惑。反过来说:else 跟着 for,不是跟着 if

总结

本质原因
默认参数对象在定义时创建,不是调用时
闭包延迟绑定引用变量,不是捕获值
is vs ==混淆了"身份"和"值"
缩进错误把 Python 当纯文本语言
遍历中修改索引在变,迭代器跟不上
字符串拼接误以为字符串可变
浅拷贝不理解引用传递
裸 except不知道异常体系
字典 key不了解可哈希规则
for-else不知道 else 的真实语义

Python 的"简单"是给老手的,新手恰恰要在这些"简单"里保持警惕。踩过这些坑,才算真正入门。

到此这篇关于一文总结10个Python新手最容易踩的语法坑的文章就介绍到这了,更多相关Python语法常见陷阱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于python log取对数详解

    基于python log取对数详解

    今天小编就为大家分享一篇基于python log取对数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 详解tf.device()指定tensorflow运行的GPU或CPU设备实现

    详解tf.device()指定tensorflow运行的GPU或CPU设备实现

    这篇文章主要介绍了详解tf.device()指定tensorflow运行的GPU或CPU设备实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • python实现线程池的方法

    python实现线程池的方法

    这篇文章主要介绍了python实现线程池的方法,实例分析了Python线程池的原理与相关实现技巧,需要的朋友可以参考下
    2015-06-06
  • Python pip 命令从入门到精通及最佳实践

    Python pip 命令从入门到精通及最佳实践

    pip是Python生态中不可或缺的工具,掌握它的各种命令和选项能够极大提升开发效率,本文从基础命令到高级用法,再到配置和常见问题,全面覆盖了pip 的使用场景,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • Python实现抓取城市的PM2.5浓度和排名

    Python实现抓取城市的PM2.5浓度和排名

    本文给大家介绍的是一则使用Python实现抓取城市的PM2.5数据和排名,
    2015-03-03
  • Python脚本实现批量修改图片DPI

    Python脚本实现批量修改图片DPI

    图片DPI这玩意儿平时不起眼,投稿的时候真能急死人,这篇文章就来和大家详细介绍一些如何使用Python脚本实现批量修改图片DPI,希望对大家有所帮助
    2026-06-06
  • Windows上使用Python增加或删除权限的方法

    Windows上使用Python增加或删除权限的方法

    下面小编就为大家分享一篇Windows上使用Python增加或删除权限的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python远程控制MySQL的完整指南

    Python远程控制MySQL的完整指南

    MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最佳实践
    2025-06-06
  • Python根据成绩分析系统浅析

    Python根据成绩分析系统浅析

    在本篇文章里小编给大家分享了关于Python根据成绩分析是否继续深造一个系统的相关知识点,有需要的朋友们学习下。
    2019-02-02
  • Python调用ChatGPT API接口的用法详解

    Python调用ChatGPT API接口的用法详解

    ChatGPT可以实现chat,生成图片,识别关键,改错等等功能,本文简单的给大家介绍一下如何使用python调用ChatGPT API接口,感兴趣的小伙伴可以参考一下
    2023-05-05

最新评论