python - 为什么我不能在函数内使用 kwargs 更改变量?

标签 python python-3.x dictionary keyword-argument

<分区>

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++ 世界),有很多复制。

最佳答案

第一个例子是错误的,你得到s=[1]:

那是因为列表 s 是一个参数,steps 而你改变了这个列表的内容。 更简单:

def assign(step):
    step += [1] # change the contents of the list

s = []
assign(step=s)
print(s) # gives [1]

这与关键字参数或字典扩展无关。如果用**或者直接给关键字作为参数是完全一样的。

不要尝试“通过引用”传递变量。这对 python 来说是不可能的。请改用返回值。

def assign(test, steps):
    return 3, steps + [1]

t, s = assign(3, [])

关于python - 为什么我不能在函数内使用 kwargs 更改变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27634574/

相关文章:

python - 如何根据列表中的值在字典列表中查找字典?

python - tf.train.shuffle_batch_join 和 tf.train.shuffle_batch 之间的区别

python - 将 Python 嵌入到 C 中 - 无法从 python 模块导入方法

python - 用于检查字符串中的变量是否存在的命令

c++ - 另一个奇怪的编译器错误 : calling a templated function which gives undefined referenes

python - 来自 Python 嵌套字典的 Pandas Dataframe

python - Python 和其他文件哈希器之间的 MD5 哈希差异

Python 最小 Modbus CRC 字节顺序

python - 构造函数及使用方法

python - 在 Python 字典中如何根据键的第一个值找到一个?