Python代码通过Shell传参后返回空列表,请求排查解决
问题排查:Shell传参后Python脚本返回空列表
课程作业代码单独运行结果正确,但通过Shell传入参数"apple" "banana" "cherry"时,预期返回
['apple', 'banana'],实际输出空列表[]。单独调用sys.argv[1]能正常返回"apple",需要排查最后问题。
原代码:
import sys set_a = sys.argv[1:] set_b = ['apple', 'banana', 'mango', 'orange'] common_list=[] def common(*args): for word in args: for word2 in set_b: if word == word2: common_list.append(word2) print({str(common_list)}) #print("{ "+str(s)[1:-1]+" }") common(set_a)
问题根源
你犯了一个参数传递的常见错误:
set_a = sys.argv[1:]得到的是列表类型,比如['apple', 'banana', 'cherry']- 调用
common(set_a)时,你把整个列表作为单个参数传给了*args,此时args的值是(['apple', 'banana', 'cherry'],)(一个包含列表的元组) - 函数内的
for word in args循环,第一次取到的word是整个列表,拿列表和set_b里的字符串做比较,必然不相等,所以没有元素被添加到common_list,最终输出空列表。
修复方案
有两种简单的修复方式:
方式1:调用函数时解包列表
在调用common时,用*解包set_a的元素,让每个元素作为单独参数传入:
common(*set_a)
此时args会变成('apple', 'banana', 'cherry'),循环就能正确遍历每个字符串,匹配set_b中的元素。
方式2:修改函数参数接收逻辑
如果不需要*args的可变参数特性,可以直接让函数接收列表:
def common(input_list): for word in input_list: for word2 in set_b: if word == word2: common_list.append(word2)
调用时直接传common(set_a)即可。
额外优化
原代码里print({str(common_list)})会把列表转成字符串后放进集合,输出格式不符合预期,建议改成直接输出列表:
print(common_list)
或者按照你注释里的格式调整:
print(f"{{ {', '.join(common_list)} }}")
修复后完整代码示例
import sys set_a = sys.argv[1:] set_b = ['apple', 'banana', 'mango', 'orange'] common_list = [] def common(*args): for word in args: if word in set_b: # 简化内层循环,直接用in判断元素是否存在 common_list.append(word) print(common_list) common(*set_a)
内容的提问来源于stack exchange,提问作者Douglas Schwartz
相关产品推荐
相关产品推荐

