为什么第一个代码片段正确交换值,而第二个代码片段却不正确?

时间:2019-03-17 12:54:15

标签: python python-3.x

第一个代码片段:

NULL

第二个代码片段:

>>> a = 5
>>> b = 7
>>> a, b = b, a
>>> a == 7
True
>>> b == 5
True

我的任务是编写一个交换两个变量值的函数。但是它不能返回任何值。我知道我可以添加第三个变量,但是我想找出第二个代码片段出了什么问题。

1 个答案:

答案 0 :(得分:2)

您将直接替换列表对象的内容,而不交换变量。因为首先替换了second_obj的内容,然后使用second_obj替换了first_obj的内容,所以最后两个列表中的first_obj列表的内容都结束了。

让我们为列表对象提供参考ID,以区分它们。变量名first_objsecond_obj本身就是对两个列表的引用:

  1. first_obj引用ID {L1},值[1, 2, 3]
  2. second_obj引用ID {L2},值[4, 5, 6]

接下来会发生什么:

  • 将两个列表按顺序压入堆栈,{L2}排在最后。
  • 交换堆栈中的前两个条目,因此现在堆栈的顶部包含第一个{L1},然后是{L2}
  • 栈顶分配给second_obj[:],它将替换列表second_obj引用中的所有值{L1}中包含的值将复制到{L2}中。 {L2}现在是[1, 2, 3]。堆栈顶部已移除。
  • 栈顶分配给first_obj[:],它将替换列表first_obj引用中的所有值{L2}中包含的值将复制到{L1}中。 {L1}现在是[1, 2, 3]。堆栈顶部已移除。

您可以通过首先创建second_obj的副本来使交换工作:

second_obj[:], first_obj[:] = first_obj, second_obj[:]