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

Python: difference between `a,b=[1,2],a` and `a=[1,2]; b=a`?

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

# 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 部分的结果感到惊讶。有人可以解释为什么结果不同吗?非常感谢您!

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

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

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

a,b=[1,2],a

[1,2]赋值给a,并将a的前一个值赋给b

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

您 运行 一次完成整个代码吗? 如果你这样做,那么混淆就很容易解释了。

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

您需要了解操作顺序。

表达式 [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]

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

现在,如果您尝试 运行 part_2 分开,您将 运行 变成 nameError 因为在 part_2、a=[1,2]b=a 正在同时执行。这意味着 a 在分配给变量 b.

时尚未分配给 [1,2]