You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:54:50