2012-04-13 26 views
1

我是一位瞭解Python的偶然玩家和愛好者程序員。我試圖製作一個簡單的文本冒險遊戲引擎,所以我需要從玩家那裏獲得原始輸入。Python - 將外部變量設置爲用戶輸入的副作用

這是Python的3.2.2,所以我行是這樣的:

var = input("What do you want to do? ").lower() 

這行工作,但不是通過打字的是整條生產線,我想將它做成一個函數(像「 getinput()「)。從我讀到的有關input()和函數的內容中,我正在尋找一種不會返回任何內容的函數,但會將另一個變量的狀態(此處爲「var」)更改爲「副作用」。

我有一個工作功能「停止()」,它沒有參數:

def halt(): 
    input("(Press Enter to continue...) ") 
    print("") 

調用「停止()」給出了提示,等待輸入,然後打印一個空行,並繼續前進,我打算這麼做。

我試圖去工作的功能如下:

def getinput(x): 
    x = input("What do you want to do? ").lower() 
    print("") 

定義getinput後(X):

var = "" 
getinput(var) 
print(var) 

片斷代碼不打印用戶的輸入,和我對於爲什麼感到困惑。我需要做什麼才能以預期的方式完成這項工作?

是我試圖做的不可能與一個函數,或者只是有一些我不知道範圍?我應該在codereview

+3

我不明白爲什麼你想使你的'getinput()'函數不返回任何東西。如果您的函數返回輸入,您的代碼將更容易理解,因爲您將*用* Python而不是*用*來工作。 – 2012-04-13 02:10:00

+0

這已經解決了很多次,一見http://stackoverflow.com/questions/986006/python-how-do-i-pass-a-variable-by-reference – 2012-04-13 02:32:40

+0

如果你想從一個函數獲取信息,然後返回信息。這就是返回值的目的。 – 2012-04-13 04:13:13

回答

4

你說得對,問題是關於範圍。在此行中的X:

x = input("What do you want to do? ").lower() 

不改變傳遞給它 - 它的價值會在函數的局部範圍內一個新的變量(也稱爲X)。

做的正確的方式,這將是:

def getinput(): 
    return input("What do you want to do? ").lower() 

x = getinput() 
print(x) 
+0

-1這不是範圍,而是關於字符串的不可變性,以及Python中的賦值是重新綁定操作而不是變異操作。 – 2012-04-13 04:13:57

+0

它仍然是關於範圍。函數外部的'x = 1'行會產生不同的效果。你似乎在分裂頭髮 - 你讀了我的答案的其餘部分? – 2012-04-13 04:29:07

+0

謝謝,這是最有幫助的。 – 2012-04-13 11:22:54

0

var是被按值傳遞給你的getinput功能,這意味着你的getinput功能只修改的本地副本蟒蛇字符串變量名稱「x」,而不是來自調用作用域的「x」指向的值。

另外在Python中,字符串是不可變的,所以不可能因爲string interning/hash consing而在原地修改字符串的基礎值 - 您只需創建一個新字符串。你確實應該回到你的價值:

x = getinput() 

但是,如果你仍然想堅持到現有的設計,您可以通過在列表或其他引用類型包裹它通過引用傳遞這個字符串變量:

def getinput(li): 
    li.append(input("What do you want to do? ").lower()) 
    print("") 
只是如果你準備3.X之前,使用任何版本的Python,肯定會考慮使用的raw_input()函數作爲普通的輸入()函數:

用法:

x = [] 
getinput(x) 
print x[0] 
2

注意從用戶處接受SYNTACTICALLY VALID的輸入,否則會引發SyntaxError。

我不知道你想要做什麼,但我身邊你上面,使其工作寫的東西感動。以下是我建議嘗試:

第一功能getinput()...

def getinput(): 
    x = raw_input("What do you want to do? ").lower() #prompts for the value of x 
    print "" #prints a blank line 
    return x 

然後第二部分...

var = getinput() 
print(var) 
+1

你約的raw_input'()'和'輸入()通知'是有效的Python 2.x的,但在Python 3.X的raw_input'()'更名爲'輸入()'。也就是說,OP使用'input()'做了正確的事情。 – 2012-04-13 02:30:36

+0

啊好抓。 >:= 0 – pepperdreamteam 2012-04-13 02:31:25

+1

別擔心,我在幾周前回答問題時做了*確切*相同的事情。支付它轉發。 :3 – 2012-04-13 02:45:30

1

當你傳遞的東西一個Python函數,它的一般不可能修改它,除非它是可變的。這限制了你的Python類型的一小部分,如列表或字典。

def getinput(x): 
    x[0] = input("What do you want to do? ").lower() 
    print("") 

var = [""] 
getinput(var) 
print(var[0]) 

你最好讓函數返回一個值。這就是Python的本意。