2015-02-01 2 views
0

Я новичок в python и стараюсь сделать простую бумагу, рок, ножницы. независимо от того, что я делаю внутри своей «хромой» функции, значение локальной переменной «y» не будет присвоено глобальной переменной «var1» или «var2». Я пытался использовать возврат, но не могу заставить работать.Функция python wont возвращает значение

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

Python не делает вызов по ссылке с номерами. Вам нужно будет фактически установить значения «val1» и «val2» для этих значений, а не 'y' – L3viathan

ответ

5

неправильно способ сделать это:

val1 = 0 

... 

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

право способ сделать это:

def lame(x): 
    return result_of_some_calculations_to_do_with(x) 

val1 = lame(x) 

Вопреки тому, что сказал L3viathan в комментарии, Python DOES pas s по ссылке, но не связывает переменные ASSIGN по ссылке. Другими словами:

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 

Это в основном то, что вы пытаетесь сделать, проходя 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 

Это важно, когда вы передаете объекты, такие как списки, которые являются изменяемыми (например, они могут быть изменены, в отличии от неизменных объектов линии int и str в 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] 
0

Сразу после того, как я разместил этот вопрос, я понял это и могу подтвердить, что сказал Адам Смит.

Вот код, я изменил, чтобы заставить его работать правильно:

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) 
Смежные вопросы