Python中sys.argv里*的含义?终端输入*异常问题咨询
问题根源:Shell的通配符扩展(Globbing)
你遇到的问题不是Python的sys.argv对*有特殊处理,而是你的终端(shell)在把参数传给Python程序之前,先对*做了「通配符扩展」操作。
具体原因拆解:
- 当你在终端输入
2 2 *时,shell会把*解析成当前目录下所有非隐藏的文件名,然后把这些文件名作为参数传递给你的Python程序。所以你的sys.argv拿到的内容其实是类似['your_script.py', '2', '2', '01.py', '01.py'],程序找不到对应的乘法符号,自然输出None。 - 当你输入
2 2 '*'时,单引号(双引号也可以)会告诉shell:「把引号里的内容当成字面量,不要做任何扩展」。这时候shell会直接把*作为参数传给程序,sys.argv拿到的是['your_script.py', '2', '2', '*'],程序就能正确识别乘法符号,输出4。
你测试中的现象验证了这一点:
- 输入
*时,终端直接输出当前文件夹的文件列表,这就是shell自动完成了通配符扩展,把*替换成了文件名; - 输入
'*'时,引号阻止了扩展,shell直接把*作为内容输出。
解决建议:
如果想让用户不用加引号也能正常输入*,可以考虑把程序改成交互式读取输入(用input()函数获取用户输入),而不是依赖命令行参数。因为当你用input()读取时,输入的内容不会经过shell的通配符扩展,用户直接输入2 2 *就能被程序正确解析。
内容的提问来源于stack exchange,提问作者acruma
相关产品推荐
相关产品推荐

