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]
被分配给 a
但 a
的 part_1 值被分配给 b
即 [1,2,3]
。由于这个原因,a
和 b
都得到 [1, 2, 3], [1, 2, 3]
。
现在,如果您尝试 运行 part_2 分开,您将 运行 变成 nameError
因为在 part_2、a=[1,2]
和 b=a
正在同时执行。这意味着 a
在分配给变量 b
.
时尚未分配给 [1,2]
按照我的理解,上面两段代码应该是一样的效果。但是为什么当我让一个点指向另一个数组时,结果可能不同呢?下面的代码说明了区别:
# 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]
被分配给 a
但 a
的 part_1 值被分配给 b
即 [1,2,3]
。由于这个原因,a
和 b
都得到 [1, 2, 3], [1, 2, 3]
。
现在,如果您尝试 运行 part_2 分开,您将 运行 变成 nameError
因为在 part_2、a=[1,2]
和 b=a
正在同时执行。这意味着 a
在分配给变量 b
.
[1,2]