Python 3取消input()是为了消除Python 2中input()等价于eval(raw_input())导致的任意代码执行漏洞,将其重命名为仅返回字符串的safe接口,并强制显式类型转换。

Python 3.x 取消 raw_input() 不是为了“简化 API”,而是为了彻底移除一个真实存在的安全漏洞入口——input() 在 Python 2 中等价于 eval(raw_input()),会无条件执行用户输入的任意代码。
Python 2 的 input() 真的会删你硬盘
这不是夸张。当你在 Python 2 中写 age = input("How old? "),然后输入 __import__('os').system('rm -rf /')(在有权限的系统上),它真会执行。因为 input() 内部就是 eval(raw_input()),不做沙箱、不加过滤、不给警告。线上服务曾因此被批量入侵。而 raw_input() 才是只返回字符串的安全接口——但它的名字太模糊,新手常误用 input()。
input() 在 Python 3 中就是 Python 2 的 raw_input()
Python 3 没有“升级”或“合并”,而是直接把危险的 input() 删了,把安全的 raw_input() 重命名为 input(),并强制开发者面对类型转换这件事:
- 所有输入都返回
str:哪怕你输42、3.14、[1,2,3],得到的都是字符串 - 想转数字?必须显式写
int(input(...))或float(input(...)) - 想解析列表或字典?得用
ast.literal_eval(),而不是eval() - 如果硬要复刻 Python 2 的行为,得手动写
eval(input())——至少你得敲完eval三个字母,心里会停一下
迁移时最常踩的坑:以为 input() 还能自动识别数字
现象是代码看似运行,但一做算术就报错:TypeError: unsupported operand type(s) for +: 'str' and 'int'。典型错误写法:
立即学习“Python免费学习笔记(深入)”;
x = input("Enter number: ")
result = x + 10 # ❌ x 是 str,不是 int正确做法(带基础防护):
try:
x = int(input("Enter number: "))
result = x + 10
except ValueError:
print("请输入有效数字")别用 eval() 替代类型转换——它不校验输入合法性,反而放大风险。
真正容易被忽略的点:输入字符串里的隐藏字符
当用户输入含换行、制表符、BOM 或非 ASCII 空格时,input() 返回的原始字符串不会自动清理。仅靠 .strip() 不够用。比如读取路径或 JSON 片段,建议根据场景改用:
-
sys.stdin.readline().rstrip('\n\r')(更底层控制) - 显式 decode + normalize(尤其处理 Windows 回车或 UTF-8 BOM)
- 对关键字段做正则清洗或白名单校验,而不是依赖“看起来像数字”就转 int
安全不是加一层 try/except 就完事,而是从第一行 input() 开始,就默认它返回的是不可信的原始字节流。


















