0

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)
1
  • 2
    Python does not do call by reference with numbers. You'll need to actually set val1 and val2 to those values, not y Commented Feb 1, 2015 at 21:46

2 Answers 2

5

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]
Sign up to request clarification or add additional context in comments.

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.