简体   繁体   English

python函数不会返回值

[英]python function wont return value

I'm new to python and am trying to make a simple paper, rock, scissors game. 我是python的新手,正在尝试制作一个简单的纸,石头,剪刀游戏。 no matter what I do inside my "lame" function the value of local variable "y" will not be assigned to global variable "var1" or "var2". 无论我在“ lame”函数中执行什么操作,都不会将局部变量“ y”的值分配给全局变量“ var1”或“ var2”。 I have tried using return but cannot get anything to work. 我已经尝试过使用return,但是无法正常工作。

#get input (paper, rock scissors from players)
play1 = input("player 1:")
play2 = input("player 2:")

#set value of players score to 0
val1 = 0
val2 = 0

def lame(x, y):
#set value of p, r, s choice, to 1, 2 or 3 
    if x in("p","P"):
        y = y + 1
    elif x in("r","R"):
        y = y + 2
    elif x in("s","S"):
        y = y + 3
    else:
        print("your value was not p, r or s")

#run function "lame" and pass in "play1" choice and 
#retrieve "val1" for that choice
lame(play1, val1)
lame(play2, val2)

def win(x, y):
#subtracts value of players choices to find winner
    dif = x - y
    if dif == 0:
        print("tie game")
    elif dif % 3 == 1:
        print("player 2 wins")
    elif dif % 3 == 2:
        print("player 1 wins")
    else:
        print("logic error")

#call function "win" and pass in results of their choices
win(val1, val2)

The wrong way to do this: 这样做的错误方法:

val1 = 0

...

def lame(x):
    global val1
    val1 = result_of_some_calculations_to_do_with(x)

The right way to do this: 正确的方法是:

def lame(x):
    return result_of_some_calculations_to_do_with(x)

val1 = lame(x)

Contrary to what L3viathan said in the comments, Python DOES pass variables by reference, but does not ASSIGN variables by reference. 与L3viathan在评论中所说的相反,Python确实通过引用传递变量,但没有通过引用传递ASSIGN变量。 In other words: 换一种说法:

x = 3 # x is 3
y = x # x is 3, y is 3, x is y
y = 4 # x is 3, y is 4, y is REASSIGNED so y is not x

That's basically what you were trying to do, passing val1 to your lame function and rebinding it as y . 这基本上就是您要尝试的方法,将val1传递给您的lame函数并将其重新绑定为y

val1 = 0 # val1 is 0

def lame(x, y):
    # y is val1
    y = some_calculations_to_do_with(x)
    # y has been REASSIGNED so y is not val1

This is important when you pass objects like lists that are mutable (eg they can be changed, as opposed to immutable objects line int and str in Python). 当您传递可变列表之类的对象(例如,可以更改它们,而不是Python中的intstr不变对象)时,这一点很重要。

val1 = list() # val1 is an empty list

def lame(x,y):
    y.append(x) # append x to y, DO NOT REASSIGN y TO ANYTHING ELSE

lame(1, val1) # val1 is [1]

Right after I posted this question I figured it out, and can confirm what Adam Smith has said. 在我发布此问题后,我立即弄清楚了,可以证实亚当·斯密的话。

Here is the code I changed to get it working properly: 这是我为了使其正常运行而更改的代码:

def lame(x): 
    #set value of p, r, s choice to 1, 2 or 3 
    if x in("p","P"):
        return 1
    elif x in("r","R"):
        return 2
    elif x in("s","S"):
        return 3
    else:
        print("your value was not p, r or s")

#run function "lame" and pass in play1 choice and 
#retrive val1 for that choice
val1 = lame(play1)
val2 = lame(play2)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM