<分区>
Python初学者的问题。我正在尝试更改函数内某些变量的值,但我不明白为什么有时它有效而有时却无效。所以我想知道幕后发生了什么。如果我写:
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
变量?实现我想要做的事情的最佳方式是什么?
更新
感谢与@6502 的讨论,因为
In Python there is no way to change a parameter that has been passed to a function because you cannot have "pointers" or "references".
The most pythonic way is not doing it. A function receive parameters and provide results. If the parameter is a mutable it can mutate its state but changing the call parameter itself was considered not needed.
然后我决定返回一个包含结果的字典:
def assign(self, **kwargs):
kwargs['test'] += 3
kwargs['steps'] += [1, 2, 3]
return kwargs
dict = {'test':1, 'steps': []}
dict = assign(**dict)
print(dict)
这当然有效,但我想知道对大数据的影响,因为在我看来(来自 C++ 世界),有很多复制。