2012-12-07 78 views
2

可能重複:
Python: How do I pass a variable by reference?的Python:重新分配值變量(使用函數)

我怎樣才能重新分配一個值,作爲一個函數參數傳遞的變量?

舉例來說,我所希望做的是:

foo = True 

def convert(foo): 
    if foo == True: 
     foo = 'on' 
    elif foo == False: 
     foo = 'off' 
    return foo 

其中foo現在是一個字符串。上述的方法的問題是,爲了改變foo從一個boolean類型爲字符串鍵入以下內容必須通過:

foo = convert(foo) 

,而我希望做類似:

convert(foo) 

或者,

foo.convert() 

任何想法?

+0

聽起來像你想這樣:http://stackoverflow.com/q/986006/21475。另外,值得關注Python的''global''關鍵字(但這裏並不適用)。 – Cameron

+0

查看Lev關於最乾淨(也是最正確)解決方案的回答。如果你堅持能夠在不返回它的情況下更改對象,請將其封裝在類或字典中(例如,簡單的黑客應該使用foo = {True}並傳遞它)。 – Bitwise

回答

7
foo = convert(foo) 

是實現這一點最清潔和最明確的方式。這是大多數人推薦的方式,如果你確定你甚至需要重新分配一個字符串到變量bool

foo.convert() 

是您可以對您需要定義的類實例執行的操作。你可以做到,但這不值得冒險。只需重新分配變量,就是這樣。

convert(foo) # actually, just convert() 

也能正常工作,但你必須使用global關鍵字在convert功能。這不被推薦,特別是當它很容易避免時。

In [1]: foo = True 

In [2]: def convert(): 
    ...: global foo 
    ...: foo = 'on' if foo else 'off' 
    ...:  

In [3]: convert() 

In [4]: foo 
Out[4]: 'on' 
+1

這不僅是最乾淨的,沒有一些非常混亂的命名空間黑客攻擊,幾乎不可能爲所有用例工作,這是不可能的。至於第二個,除非你做了類似'convert()'到'object'的操作(這將是一個非常糟糕的主意),也是不可能的。 –

+0

@ sr2222我不知道如何用猴子補丁來實現這一點。我的意思是,該方法不能重新分配它的所有者,對吧?但是,定義一個類可以做些什麼,但可能會涉及代碼其餘部分的一些更改。無論如何,即使考慮它也是一個壞主意。編輯:我沒有得到你的意思是'對象',而不僅僅是「對象」。儘管如此,仍然不確定如何提供幫助。 –

+0

你可以將''convert''轉換爲'object'本身,這意味着沒有自己的'convert'的每個對象(至少是新風格和最內置的)現在都會有'convert'您定義的方法。由於'foo'的類型是未定義的,事實上不能定義,所以在OP的場景中,唯一的方法是添加一個更接近於普遍的方法,就是做一個非常糟糕的事情,並直接用'object'擰緊。儘管如此,如果沒有明確的賦值,實際上將轉換後的值推回到'convert'所調用的任何名稱空間中的標籤將會是一些非常棘手的代碼。 –

相關問題