如何避免 arg kwargs 不可变?

问题描述 投票:-1回答:1

我有一个A类

class A:
  __dict__ = {"x": 0}

  def __init__(self, **kwargs):
    self.__dict__.update(kwargs.copy())

当我创建A对象时。

>>> a = A(x=2)
>>> b = A(x=3)
>>> print(a.__dict__)
{x: 3}
>>> print(b.__dict__)
{x: 3}

当我预设 口述启动,它变成了可突变的,如何避免这种情况?

python mutable kwargs
1个回答
0
投票

你可以用 dict.copy() 以获得新的(浅显的)副本。kwargs,像这样。

class A:
  def __init__(self, **kwargs):
    self.local_copy = kwargs.copy()
    print(id(self.local_copy))

a2 = A(x=2)
a3 = A(x=3)
print(a2.local_copy)
print(a3.local_copy)

例子输出:

15067008
15031824
{'x': 2}
{'x': 3}

EDIT: 正如 @chepner 在评论中指出的那样,在 copy 是没有必要的。我想你得到同样的原因是 id 对于这两种不同的调用,kwargs在函数返回后就不被引用了,所以对象可能会被垃圾回收,它的地址被重复使用。

即使没有复制,我也得到了同样的结果。(2个不同的ID, 和不同的A对象)

© www.soinside.com 2019 - 2024. All rights reserved.