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