以我的理解,上面两段代码应该是一样的效果。但是为什么当我指向另一个数组时,结果可能会有所不同?以下代码说明了区别:
# 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 部分的结果感到惊讶。有人可以解释为什么结果不同吗?在此先感谢您!
编辑:非常感谢大家!现在我明白了问题所在!非常感谢!
答案 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]
和 a
的 b
。
现在,如果您尝试单独运行 part_2,您将遇到 nameError
,因为在 part_2 中,a=[1,2]
和 b=a
正在同时执行。这意味着当 a
被分配给变量 [1,2]
时,它尚未被辅助到 b
。