当前位置: 首页 > 面试题库 >

Python是否在分配时复制对象?

卫学真
2023-03-14
问题内容

我希望下面的代码只会初始化dict_adict_b以及dict_c字典。但它似乎具有复制效果:

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print dict_a
print dict_b
print dict_c

如您所见,结果如下:

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

为什么该程序会产生先前的结果,当我期望它返回时:

{}
{}
{'hello': 'goodbye'}

问题答案:

这是因为在Python中,变量(名称)只是对单个对象的引用。当您指定dict_a = dict_b,你真的复制存储器地址(或指针,如果你愿意)从dict_bdict_a。该词典仍然有一个实例。

要获得所需的行为,请使用dict.copy方法,或者copy.deepcopy如果您的字典可能具有嵌套的字典或其他嵌套的对象,请使用。

>>> a = {1:2}
>>> b = a.copy()
>>> b
{1: 2}
>>> b[3] = 4
>>> a
{1: 2}
>>> b
{1: 2, 3: 4}
>>>


 类似资料:
  • 问题内容: 这是自动装箱吗? 上面的代码是否会先将int文字8包装为Integer,然后将其引用分配给变量ob?因为Java语言规范在这种情况下没有任何帮助。 问题答案: 上面的代码是否会先将int文字8包装为Integer,然后将其引用分配给变量ob? 是。(或者更确切地说,它将把值装箱到一个对象中,然后将引用分配给变量。实际上,整数值是文字的事实在这里是无关紧要的。例如,它可以是return的

  • 问题内容: 我需要在Java中将序数值转换为枚举值。这很简单: 该方法是隐式的,我无法找到它的源代码,因此是一个问题。 是否分配新数组?如果可以的话,第一次调用时是否应该缓存该数组?假设将非常频繁地调用转换。 问题答案: 是。 Java没有让我们创建不可修改数组的机制。因此,如果返回相同的可变数组,我们将冒有人可以为所有人更改其内容的风险。 因此,在将不可修改的数组引入Java之前,为了安全起见,

  • 问题内容: 在课堂上,我有: 除了可以从参数中提供的对象创建bar的副本之外,还可以在构造函数中包含指向bar的指针,以便更改原始bar会更改此对象中的字段吗? 另一种放置方式: 可以进行设置,以便打印y打印9而不是7? 问题答案: 您的最后一个示例以这种方式工作,因为 int 是基元,它是按值复制的。在第一个示例中,“ this.bar ”将保存对 bar 的引用(某种指针)的副本。因此,如果您

  • 有没有简单的方法来验证对象是否属于给定的类?例如,我可以这样做 但是这需要每次动态实例化一个新对象,只是丢弃它。有更好的方法来检查“a”属于“MyClass”类吗?

  • 我最近一直在玩WireMock(Standalone),觉得它很棒。今天,我注意到,据我所知,WireMock在记录模式下播放已经保存的响应的行为。 我想我可能弄错了,因为知道这一点非常重要,但我在文档中看不到它,除了这个: 笔记 记录器将忽略与已捕获的请求匹配的任何请求。 不清楚这是否意味着: 请求将被路由到第三方服务,并将返回实时响应。或 保存的响应将被返回,在这种情况下,第三方服务将不会受到