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

为何Python中两种函数传参方式输出结果不同?

两种传参方式的差异原因分析

首先看原代码:

import itertools
def f(x,y,z,w):
    return ((x and y) or (y and z)) == ((not(x) or w) and (not(w) or z))

for p in itertools.permutations("xyzw"):
    ans = []
    t = [(0,1,1,1), (0,1,0,0), (0,1,0,1)]
    for r in t:
        #ans.append(f(*r))
        #ans.append(f(**dict(zip(p,r))))
    if ans == [1,1,1]:
        print(*p)
        break

问题现象

取消注释ans.append(f(*r))时程序无输出,取消注释ans.append(f(**dict(zip(p,r))))时程序有输出,两种传参方式结果不一致。

核心差异

两种传参方式的逻辑完全不同:

  • f(*r):按位置传参
    不管循环中的p是什么排列,r里的四个值会固定按顺序传给f的x,y,z,w参数。也就是说,r[0]永远对应x,r[1]永远对应y,r[2]对应z,r[3]对应w。此时p的排列完全不起作用,程序相当于在找“固定按位置传参时三次调用都返回True”的场景,但实际上不存在这样的情况,所以无输出。

  • f(**dict(zip(p,r))):按关键字传参
    这行代码会把p的每个字符作为参数名,对应r里的对应值,按关键字传给函数f。比如如果p是yxzw,那么r=(0,1,1,1)会被解析为y=0, x=1, z=1, w=1,然后函数f会按照自己定义的参数顺序(x,y,z,w)来匹配这些值,最终实际传入的是x=1, y=0, z=1, w=1。

    程序的核心逻辑就是遍历xyzw的所有排列,找到能让三次调用都返回True的参数映射关系,而只有关键字传参才能利用p的排列来调整参数值的对应关系,所以能找到符合条件的排列并输出。

内容的提问来源于stack exchange,提问作者Jvnko_Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:53:12