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

Python对象混乱:a = b,修改b并进行更改!

叶允晨
2023-03-14
问题内容

我以为我知道Python,直到今晚。做这样的事情的正确方法是什么?这是我的代码:

a = ["one", "two", "three"]
b = a  # here I want a complete copy that when b is changed, has absolutely no effect on a
b.append["four"]
print a  # a now has "four" in it

基本上,我想知道,而不是该b = a步骤,我将如何正确地制作列表或字典的副本,以便b更改时a不会随之更改?


问题答案:

您正在体验的是引用的概念。Python中的所有对象都有一个引用,当您将一个名称分配给两个名称a和时b,这将导致两者ab指向 _同一_对象。

>>> a = range(3)
>>> b = a                     # same object
>>> b.append(3)
>>> a, b                      # same contents
([0, 1, 2, 3], [0, 1, 2, 3])

随着名单,你可以创建一个新的列表b是一个 副本, 另一个a使用b = a[:]

>>> a = range(3)
>>> b = a[:]                  # make b a new copy of a
>>> b.append(3)
>>> a, b                      # a is left unchanged
([0, 1, 2], [0, 1, 2, 3])

有关任何对象的更通用解决方案,请使用copy模块。浅表副本将复制要复制的对象中存储的引用,而深表副本将递归地创建所有对象的新副本。

>>> a = [range(2), range(3)]
>>> b = copy.copy(a)          # shallow copy of a, equivalent to a[:]
>>> b[0] = range(4)
>>> a, b                      # setting an element of b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1, 2, 3], [0, 1, 2]])
>>> b[1].append(3)
>>> a, b                      # modifying an element of b modifies the element in a
([[0, 1], [0, 1, 2, 3]], [[0, 1, 2, 3], [0, 1, 2, 3]])

>>> a = [range(2), range(3)]
>>> b = copy.deepcopy(a)      # deep recursive copy of a
>>> b[1].append(3)
>>> a, b                      # modifying anything in b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1], [0, 1, 2, 3]])


 类似资料:
  • 问题内容: 这是我的第一个问题,我开始学习Python。之间有什么区别: 和 在下面的示例中编写时,它显示不同的结果。 和 问题答案: 在中,在将右侧的表达式赋给左侧之前对其求值。因此,它等效于: 在第二个示例中,运行时已更改的值。因此,结果是不同的。

  • 然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 在vue3中, 如果我按上面的写法,将currentOptional赋值到了myOptionalList中后, 清空currentOptional,发现myOptionalList也会被清空 我知道这是引用传递的问题,解决方法是进行深拷贝, 但是我有点疑惑,我记得vue2中好像不存在这种问题啊, 是我记错了吗

  • 问题内容: 我有以下矩阵sigma和sigmad: sigma: sigmad: 如果我尝试解决python中的广义特征值问题,则会获得: V: 如果我尝试在matlab中解决ge问题,我将获得: V: 但是d确实是巧合。 问题答案: 特征向量的任何(非零)标量倍数也将是特征向量。只有方向是有意义的,而不是整体规范化。不同的例程使用不同的约定- 通常您会看到幅度设置为1,或最大值设置为1或-1-某