KDnuggets

7 Python Mistakes Beginners Make (And What to Do Instead)

8.5内容质量

TL;DR · AI 摘要

本文列举了Python初学者常见的七个错误及解决方法,帮助避免常见陷阱。

核心要点

  • 使用pip时需确认当前Python环境路径,通过sys.executable验证
  • 模块导入失败时检查文件名是否与模块冲突,用module.__file__定位
  • 处理用户输入时必须显式转换类型,避免str类型导致计算错误

结构提纲

按章节快速跳转。

  1. 揭示Python运行时错误的常见根源在于代码意图与实际执行的差异

  2. 通过sys.executable验证当前Python解释器路径

  3. 使用module.__file__检查模块实际加载路径

  4. 必须显式用int()转换用户输入字符串

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Python常见错误
    • 环境问题
      • 多Python冲突
      • 虚拟环境管理
    • 类型错误
      • 输入转换遗漏
      • 方法返回值误用
    • 迭代问题
      • 修改迭代对象
      • zip参数不匹配

金句 / Highlights

值得收藏与分享的关键句。

  • pip安装包与运行环境不一致时,通过print(sys.executable)验证当前Python路径

    第1个错误说明

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 模块导入失败的70%情况源于当前文件名与要导入的模块名称冲突

    第2个错误说明

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 使用zip()时添加strict=True参数可强制要求所有可迭代对象长度一致

    第7个错误说明

    ⬇︎ 下载 PNG𝕏 分享到 X
#Python#编程错误#调试技巧#虚拟环境
打开原文

7 个 Python 新手常犯的错误(以及正确的做法) - KDnuggets

publ: 2026年8月31日

  • 博客热门文章
  • 主题 AI 职业建议 计算机视觉 数据工程 数据科学 语言模型 机器学习 MLOps NLP 编程 Python SQL
  • 数据集
  • 活动
  • 资源 快速参考指南 推荐 技术简报
  • 广告

订阅电子报

#header end

/ad_wrapper

7 个 Python 新手常犯的错误(以及正确的做法)

这些错误会导致运行中的程序出现错误。以下是其中七个常见错误。每个错误都会说明其隐藏原因,并提供首个值得检查的解决方法。

By

Nahla Davies

, KDnuggets 于 2026年8月31日发布在

Python

<div class="addthis_native_toolbox"></div>

一些 Python 错误会通过 traceback 明确提示。而有些令人困扰的错误则不会。pip 坚称包已安装,但导入却失败。昨天还能正常运行的脚本,今天突然找不到明明存在的函数。两个列表被配对后,记录却悄然消失,没有任何错误提示或警告。

这些现象背后有一个令人不安的共同点:Python 完全按照你的要求执行了操作。问题出在你实际要求的与你假设的之间存在差距,而正是这个差距让新手浪费了整个下午的时间。这里讨论的不是语法错误,也不是 KDnuggets 之前提到过的常见 Python 陷阱(如可变默认参数),而是那些会导致运行程序出错的错误。以下是其中七个错误。每个错误都会说明其隐藏原因,并提供首个值得检查的解决方法。

症状

隐藏原因

首次检查

  1. pip 安装成功但导入失败

存在两个不同的 Python 解释器

code
print(sys.executable)
  1. 导入找到错误的模块

你的文件覆盖了模块名称

code
print(module.__file__)
  1. 用户输入导致数学运算崩溃
code
input()

返回字符串类型

在边界处使用

code
int()

进行转换

  1. 程序继续运行但输出缺失
code
except Exception: pass

保留 traceback 信息

  1. 循环跳过项目 / 运行时错误

迭代时修改集合

遍历副本而非原集合

  1. 变量变成 None
code
list.sort()

返回 None

使用

code
sorted()

生成新列表

  1. zip() 忽略记录

在最短可迭代对象处停止

在 Python 3.10+ 中使用

code
zip(..., strict=True)

图1. 七个错误作为故障排除参考:症状、隐藏原因和首次检查方法。来源:Python 官方文档。原始矩阵由本文作者创建。

1. 将包安装到不同的 Python 环境

新手糟糕一天的经典开场:pip install requests 成功完成,你运行脚本时,Python 却报错 ModuleNotFoundError: No module named 'requests'。你重新安装一次,错误依旧。这时你可能会觉得 pip 和 Python 在故意误导你,但真相其实更无聊:你系统中存在两个不同的 Python 解释器。多年来机器上会积累多个解释器,每个虚拟环境都会自带自己的解释器和包目录。PATH 环境变量中的 pip 可能属于一个 Python,而你的脚本却在运行另一个 Python。

解决方法是防止它们相互分离。创建并激活一个环境,然后通过实际运行代码的解释器进行所有安装:

code
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
python -m pip install requests

如果问题仍然存在,不要第四次重新安装。在失败的脚本中打印 sys.executable,然后将其与 python -m pip --version 的输出进行比较。如果路径不同,说明重新安装根本无法解决问题。打包指南中的 pip 和 venv 操作指南可能只需十分钟,就能彻底解决这类问题。

2. 你的文件名劫持了导入

将练习文件命名为 json.py,在其中写入 import json,然后观察 Python 因属性缺失或循环导入而崩溃。你也可以用 random.py 或 csv.py 实现相同效果,甚至用 pandas.py 破坏第三方代码。

发生的原因:Python 会遍历模块搜索路径来解析导入,而你的脚本所在目录通常位于路径的前面。因此你的 json.py 会比标准库的版本先被找到。所有期望真实模块的代码现在都会收到你的三行练习文件,而这些代码都无法正常处理这种情况。

重命名文件后问题通常会立即消失。如果问题仍然存在,请删除旁边的 __pycache__ 文件夹。对于未来可能出现的类似困惑,只需添加一行代码即可确认 Python 实际加载了什么:print(module.__file__)。

3. 信任输入具有你想要的类型

code
age = input("How old are you? ")
next_year = age + 1  # TypeError: can only concatenate str (not "int") to str

input() 总是返回字符串,无论用户输入什么。用户输入了 25?你得到的是 "25"。上面的崩溃是这种错误的友好版本。更危险的情况是像 "9" > "10" 这样的比较,这在字符串排序中是合法的,并会静默返回 True。

在边界处刻意进行类型转换,并捕获可能产生的唯一失败情况:

code
try:
    age = int(input("How old are you? "))
except ValueError:
    print("Please enter a whole number.")

这就是全部要点:外部值在进入程序的那一刻就会被显式转换为特定类型,并在用户能够处理的地方捕获特定的 ValueError。

4. 捕获异常并抹除证据

这段代码到底哪里有问题?

code
try:
    process(records)
except Exception:
    pass

问题很多,但原因与初学者想象的不同。捕获异常本身没有问题。丢弃唯一能说明失败原因的证据才是真正的错误。假设 process() 在处理第 4000 条记录时崩溃,这段代码会漠然继续执行,导致损害在几天后才显现,那时某个报告突然缺少数据行,却没人知道原因。

错误和异常教程指明了出路:只捕获你预期且知道如何处理的特定异常,让其他所有异常继续传播。如果你确实需要在某个外围边界进行广泛捕获,请记录异常并重新抛出,这样程序既能获得上下文信息又不会丢失堆栈跟踪。沉默是唯一会让你同时失去故障信息和解释的选项。当特定处理变得自然后,一些实用的错误处理工具可以帮助减少重复代码。

5. 遍历集合时修改它

假设你要清理不活跃用户:

code
for user in users:
    if not user.active:
        users.remove(user)   # skips the neighbor of every removed item

删除元素会使它之后的所有元素向左移动一位,但循环的内部索引会继续递增,因此每次删除后紧随其后的元素永远不会被检查。你正在修改的列表与控制循环的结构是同一个,这两个操作会产生干扰。字典对此有更严格的限制,会在迭代过程中直接抛出 RuntimeError 异常。

Python 官方教程建议了两种安全模式:如果必须就地修改,应遍历副本;或者构建一个新集合,这通常更清晰:

code
for user in users.copy():      # 安全:遍历副本
    if not user.active:
        users.remove(user)

active_users = [u for u in users if u.active]   # 通常更优

6. 保存原地方法的返回值

一个看似简单却令人困惑的下午:

code
numbers = numbers.sort()   # numbers 现在变为 None

list.sort() 会直接在原列表上进行排序并返回 None。这是刻意为之的设计,目的是避免与生成副本的操作混淆。但这也意味着上述赋值操作会直接丢弃刚刚排序好的列表,取而代之的是 None。这个错误会在后续某个完全不相关的地方以 "NoneType' object is not iterable" 的形式暴露出来。

存在两种惯用写法,必须明确选择其一:想要修改原列表时单独调用 numbers.sort();想要生成新列表时使用 numbers = sorted(numbers)。其他具有副作用的方法(如 append() 和 reverse())也应持同样谨慎态度;如果方法会修改对象,除非文档另有说明,否则应预期其返回 None。

7. 假设 zip() 会提醒你缺失的数据

用 zip() 配对姓名和分数并统计输出结果:

code
names = ["Amara", "Ben", "Chen", "Dana"]
scores = [91, 84, 77]

print(list(zip(names, scores)))
# [('Amara', 91), ('Ben', 84), ('Chen', 77)]  ...Dana 神秘消失了

默认情况下 zip() 会在最短可迭代对象耗尽时直接停止。没有任何异常或警告,只有记录会突然中断。如果这些是标签和预测结果,你可能会带着这个 bug 上线。当等长性确实是数据契约的一部分时,应在代码中明确:zip(names, scores, strict=True) 会在长度不一致时立即抛出 ValueError。需要注意的是,strict 参数是在 Python 3.10 中引入的,因此在更早版本中需要自行比较长度后再配对。

让失败显而易见

回顾这七点,一种习惯开始成形。这些 bug 都不是 Python 行为异常导致的,而是程序从未达成的假设造成的,这些假设在后续某个环节突然崩溃时才显现出来。

因此当程序出现不合理行为时,先不要急于重写。首先要对其进行质询。检查实际运行的解释器(sys.executable),确认每个导入模块的真实来源(module.__file__)。查看你实际持有的类型和值,而不是你以为应该持有的值。在明确决定恢复策略之前,让意外异常保持明显。这种简短的质询往往能在几分钟内解决大量初学者的调试问题,并培养出结构化 Python 课程所需的核心直觉。Python 本身具有惊人的一致性。通常最快的修复方式是找出你那些从未被 Python 认可的假设。

Nahla Davies 是一名软件开发人员和技术作家。在全职投入技术写作之前,她曾担任一家位列 Inc. 5,000 的体验式品牌机构的首席程序员,该机构的客户包括三星(Samsung)、时代华纳(Time Warner)、Netflix 和索尼(Sony)等。

关于该主题的更多内容

  • 停止使用 If-Else 链:在 Python 中改用注册表模式
  • 数据科学家求职时常见的 7 个错误
  • 用 Polars 替代 Pandas:性能深度解析
  • 5 个常见数据科学错误及避免方法
  • 5 个可能导致机器学习项目失败的关键特征工程错误
  • 阻止数据科学家获得工作的 5 个简历错误

<hr class="grey-line"><br> <div><h3>我们推荐的 5 门免费课程</h3><br> </div>

Mailchimp for WordPress v4.14.0 - https://wordpress.org/plugins/mailchimp-for-wp/

/ Mailchimp for WordPress 插件

您可以从这里开始编辑。

如果评论已关闭。

<= 上一篇

下一篇 =>

#content end

<script type="text/javascript">kda_sid_write(kda_sid_n);</script>

最新文章

  • 用 DSpark 投机解码加速大语言模型推理 Python 新手常犯的 7 个错误(以及应对方法) 本地 AI 堆栈助力高效小型语言模型 量化与剪枝方法让大语言模型更轻量 从谷歌工程师的不可或缺提示中可以学到什么 人工智能对就业市场的影响分析

热门文章

  • 本地 AI 堆栈助力高效小型语言模型
  • 如何利用本地小型语言模型推进您的项目
  • 如何在人工智能领域构建职业生涯:3 条明确路径
  • 从人工智能编码代理获得更多结果的 10 条规则
  • 人工智能代理在五大行业变革中的实际应用案例
  • 构建端到端数据科学作品集项目的完整指南
  • 2026 年人工智能编码代理的十大开源基准测试
  • 超越模板的 Python 数据类
  • 从谷歌工程师的不可或缺提示中可以学到什么
  • 仅用 3 条命令即可在本地运行 Qwen3.8-27B 作为人工智能编码代理

#content_wrapper end

© 2026

Guiding Tech Media

|

关于

联系我们

广告合作

隐私政策

服务条款

发布于 2026 年 8 月 31 日

blank

不,谢谢!

/.main_wrapper

<script defer type="text/javascript" src="https://s7.addthis.com/js/300/addthis_widget.js#pubid=gpsaddthis"></script>

noptimize

/noptimize