Python:`a,b=[1,2],a` 和 `a=[1,2] 之间的区别; b=a`?

时间:2021-04-14 02:48:54

标签: python python-3.x python-2.7

以我的理解,上面两段代码应该是一样的效果。但是为什么当我指向另一个数组时,结果可能会有所不同?以下代码说明了区别:

# part 1
a=[1,2]
b=a
a=a+[3] # a points to a new array. b should still points to [1,2]
print(a, b) # [1, 2, 3] [1, 2]. My expected result.

# part 2
a,b=[1,2],a
a=a+[3] # a points to a new array. b should still points to [1,2]
print(a, b) # [1, 2, 3] [1, 2, 3]. Why the result is different from the above?

我对第 2 部分的结果感到惊讶。有人可以解释为什么结果不同吗?在此先感谢您!

编辑:非常感谢大家!现在我明白了问题所在!非常感谢!

6 个答案:

答案 0 :(得分:3)

您需要在隔离的环境中运行测试。您的“第 2 部分”测试从“第 1 部分”中获取 a 值。

答案 1 :(得分:2)

线

a,b=[1,2],a

[1,2] 分配给 a,并将之前的 a 值分配给 b

这意味着 b 将具有 a 的先前值,即 [1, 2, 3]

答案 2 :(得分:2)

你需要了解操作的顺序。

表达式 [1,2],a 正在构建一个具有两个元素的元组。第一个元素是列表 [1,2],第二个元素是 a 的现有值,它在第 1 部分中设置为 [1,2,3]

现在这个元组被赋值解包了,所以 a = [1,2]b=[1,2,3]

然后您修改 a 使其巧合地与 b 相同。

如果您在测试的两个部分使用不同的常量,整个过程会更加清晰。

# a=[1,2,3] from part 1
a,b=[4,5],a
a=a+[6]
print(a,b) # [4, 5, 6] [1, 2, 3]

答案 3 :(得分:0)

好吧,a 已经是“第 1 部分”中的 [1, 2, 3],所以当您将其分配给“第 2 部分”中的 b 时,当然 b 将是[1, 2, 3]...

答案 4 :(得分:0)

您是否一次性运行了全部代码? 如果您这样做,那么很容易解释混淆。

当你在第二部分设置 b = a 时,它取实际的 a 值,由于第一部分,它是 [1,2,3]。

答案 5 :(得分:0)

发生这种情况是因为您在同一环境中同时运行 part_1 和 part_2。 现在在这一行中, a, b = [1,2], a 列表 [1,2] 被分配给 a,但 a 的 part_1 值被分配给 b,即 [1,2,3]。由于这个原因,您将获得 [1, 2, 3], [1, 2, 3]ab

现在,如果您尝试单独运行 part_2,您将遇到 nameError,因为在 part_2 中,a=[1,2]b=a 正在同时执行。这意味着当 a 被分配给变量 [1,2] 时,它尚未被辅助到 b