user3806377
user3806377

Reputation: 1

python function wont return value

I'm new to python and am trying to make a simple paper, rock, scissors game. 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". I have tried using return but cannot get anything to work.

#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)

Upvotes: 0

Views: 136

Answers (2)

user3806377
user3806377

Reputation: 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)

Upvotes: 0

Adam Smith
Adam Smith

Reputation: 54163

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. 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 = 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 (e.g. they can be changed, as opposed to immutable objects line int and str in Python).

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]

Upvotes: 5

Related Questions