python 3的input()不再执行表达式求值,因设计者移除eval()调用以防止rce风险;它仅返回字符串,需手动转换并处理异常,空输入或空白字符须预处理。

Python 3的input()为什么不再执行表达式求值
因为设计者明确移除了eval()调用逻辑,避免用户输入任意代码导致的远程代码执行(RCE)风险。Python 2的input()本质是eval(raw_input(prompt)),相当于把控制台输入直接喂给eval——这在交互式调试中看似方便,但在脚本或网络服务中等于主动打开后门。
常见错误现象包括:用户输__import__('os').system('rm -rf /')就真删文件;输open('/etc/passwd').read()就泄露敏感内容。这些在Python 3中全部变成普通字符串,不会执行。
需要数字时必须手动转换,否则会报TypeError
Python 3的input()只返回str,哪怕你敲的是42或3.14。直接拿它做算术运算必然失败:
age = input("Enter age: ")
print(age + 1) # TypeError: can only concatenate str (not "int") to str
正确做法是显式转换,并处理可能的异常:
- 用
int(input(...))转整数,但用户输abc或3.5会抛ValueError - 用
float(input(...))转浮点数,能接受42、3.14、-1e2,但xyz仍报错 - 生产环境建议包一层
try/except,而不是假设用户一定输对
input()和raw_input()在跨版本迁移时怎么对应
Python 2的raw_input()和Python 3的input()行为完全一致:都返回str,不求值,不解析语法。而Python 2的input()在Python 3中没有等价物——它被刻意废弃了。
如果你在维护老项目并计划升级到Python 3,注意以下替换原则:
- 所有
raw_input(...)→ 直接改写为input(...) - 所有
input(...)→ 必须先判断原意:若本意就是读字符串,也改用input(...);若本意是读数字,则改为int(input(...))或float(input(...)),并补异常处理 - 绝不要试图用
eval(input(...))去“还原”Python 2行为——这是退回到不安全模式
真正容易被忽略的边界情况:空输入和空白字符
input()对用户按回车(即空行)返回空字符串'',不是None,也不是0。这个值在布尔上下文中为False,但直接参与类型转换会出错:
num = int(input("Enter number: ")) # 用户直接回车 → ValueError: invalid literal for int()
更隐蔽的是首尾空格:" 42 "能被int()接受,但" 42.5 "不能被int()接受,却能被float()接受。实际使用中建议统一用str.strip()预处理:
x = input("Enter value: ").strip()
if x: # 避免空输入
try:
num = float(x)
except ValueError:
print("Not a valid number")
安全输入从来不是“只要转成数字就行”,而是“先清理、再判断、最后转换”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











