为何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
相关产品推荐
相关产品推荐

