Python 从列表中随机选择函数并测试它是哪个函数时的奇怪行为

Python 从列表中随机选择函数并测试它是哪个函数时的奇怪行为,python,random,Python,Random,假设我有两个函数: def f1(): pass def f2(): pass def function1_and_something(): function1() #Do something def function2_and_something_else(): function2() #Do something else random.choice([function1_and_something, function2_and_some

假设我有两个函数:

def f1():
    pass

def f2():
    pass
def function1_and_something():
    function1()
    #Do something

def function2_and_something_else():
    function2()
    #Do something else

random.choice([function1_and_something, function2_and_something_else])() # chose and call
如果我想随机运行这两个函数中的一个,我可以这样做:

flist = (f1, f2)
function = random.choice(flist)()
不幸的是,当我想测试哪个函数使用的是if语句时

if function == f1:
    print "Good"

良好
未输出。为什么?

在不知道函数是什么或您想要做什么的情况下,我只是将它们设置为字符串,以说明如何使用random.choice和比较值

import random
list_thing = ["function1", "function2"]
var = random.choice(list_thing)
if var == "function1":
    print "var is equal function1"
elif var == "function2":
    print "var is equal to function12"

正如roippi所评论的,您的两个代码块在
var
中存储不同的值。在第一个版本中,您将存储在
var
中选择的函数(当您使用
var()
调用它时,您将放弃返回值)。在第二个块中,您在选择函数后立即调用该函数,并且
var
会被分配函数的返回值(这可能会使您与函数的比较没有用处)

第二个代码块相当于第一个代码块的修改版本:

list_thing = [function1, function2]
var = random.choice(list_thing)
var2 = var()              # call the chosen function, and save its return value  as var2
if var2 == function1:     # compare against var2, rather than var here
    #Do something
elif var2 == function2:   # here too
    #Do something else
除非您的函数可以返回它们自己(或彼此),否则代码的第二个版本可能不是您想要的。如果不知道函数的作用,或者您的
#do something
块的意思,就很难说出您应该做什么。我认为,另一种方法是将函数调用与另一个函数中的
#something
一起打包,然后在包装函数之间进行选择:

def f1():
    pass

def f2():
    pass
def function1_and_something():
    function1()
    #Do something

def function2_and_something_else():
    function2()
    #Do something else

random.choice([function1_and_something, function2_and_something_else])() # chose and call

你需要给出一个例子来说明什么是
list\u thing
以及它里面是什么。用if或while来显示列表和代码。如果var=random,你是否尝试执行
choice(list\u thing)(
?@user2357112我已经编辑了我的问题,希望它现在更有意义。这两个代码片段做的事情不同
var
在第一个代码段中绑定到函数对象,在第二个代码段中绑定到
var
的返回值。我认为这个答案不是很有帮助(尽管提问者可能不同意我的观点)。问题中非工作代码的问题是,
var
获取的是所选函数的返回值,而不是工作版本中的函数本身。OP想要什么并不十分清楚,您可以从他的语法错误中看到,如
var=random.choice(list_thing)()
他需要在做其他事情之前,先向他展示如何使用正确的语法。嗯,我的观点是,
random.choice(list_thing)(
不一定是一个错误。如果该列表是函数列表,则该表达式将选择一个函数并调用它(不带参数)。问题似乎是表达式的值是函数的返回值,而不是函数本身(因此您无法有效地将
var
与函数进行比较)。我知道
random.choice(list_thing)(
不一定是一个错误,而是OP使用
var()的事实
如果var==function1:
也让我觉得他不确定自己在做什么是合乎逻辑的。好吧,你肯定是对的,提问者想要什么并不很清楚。我们的辩论促使我作出自己的回答。希望在我们的两个答案之间,这个问题能够得到充分的理解和解决!