Python初學者的問題。我試圖改變一個函數內部的一些變量的值,我不明白爲什麼有時它有效,有時它不會。所以我想知道幕後發生了什麼。如果我寫:爲什麼我不能在函數中使用kwargs來更改變量?
def assign(self, **kwargs):
kwargs['test'] = 3
kwargs['steps'] += [1]
t = 1
s = []
assign(test=t, steps=s)
print(t)
print(s)
這仍然打印
1
[]
現在,如果我改變功能分配給
def assign(self, **kwargs):
kwargs['test'] += 3
kwargs['steps'] += [1, 2, 3]
它改變了列表,但不是整數。所以我想這與整數是不可變的,列表是可變的這一事實有關。所以我想用字典來確保我的變量被改變了。所以後來:
dict = {'test':1, 'steps': []}
assign(**dict)
print(dict)
仍然打印
{'test': 1, 'steps': [1, 2, 3]}
具有完全相同的行爲,所以現在我真的很困惑。看來,解壓縮字典時,我不再傳遞對字典變量的引用,以便這些unpacked
變量正在被值複製?什麼是最好的方式來實現我想要做的事情呢?
UPDATE
由於與@ 6502的討論,因爲
在Python有沒有辦法改變已經傳遞給函數,因爲你不能有「指針」的參數或「參考」。
最pythonic的方式是不這樣做。一個函數接收參數並提供結果。如果參數是可變的,它可以改變它的狀態,但是改變調用參數本身被認爲是不需要的。
然後,我決定返回的結果,而不是一本字典:
def assign(self, **kwargs):
kwargs['test'] += 3
kwargs['steps'] += [1, 2, 3]
return kwargs
dict = {'test':1, 'steps': []}
dict = assign(**dict)
print(dict)
這個工作,當然,但我不知道對大數據的影響,因爲它在我看來,(從C來++世界),有很多複製。
簡單地直接傳遞一個字典的功能和接受它作爲一個普通的說法,這是沒有必要的。 – yole
是的,我知道這是有效的,但我不能解壓縮多個字典。我想明白爲什麼這個'kwargs'不起作用。 – aaragon
你可能想看看http://stackoverflow.com/questions/16039280/mutability-of-the-kwargs-argument-in-python – hyades