这是一个例子:
l = [1, 5, 9, 3]
h = l
h[0], h[2] = h[2], h[0]
print(h) # [9, 5, 1, 3]
print(l) # [9, 5, 1, 3]
h = h*2
print(h) # [9, 5, 1, 3, 9, 5, 1, 3]
print(l) # [9, 5, 1, 3]
Run Code Online (Sandbox Code Playgroud)
我的理解是,调用设置h = l
只会指向h
内存中l
指向的同一项.那么为什么在最后3行中,h
并l
没有给出相同的结果呢?
检查非常简单,运行这个简单的测试:
l = [1, 5, 9, 3]
h = l
h[0], h[2] = h[2], h[0]
print(h) # [9, 5, 1, 3]
print(l) # [9, 5, 1, 3]
print id(h), id(l)
h = h * 2
print id(h), id(l)
print(h) # [9, 5, 1, 3, 9, 5, 1, 3]
print(l) # [9, 5, 1, 3]
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样h = h * 2
,h的id已被更改
为什么是这样?当您使用*
运算符时,它会创建一个新列表(新的内存空间).在你的情况下,这个新列表被分配给旧的h引用,这就是为什么你可以看到id后不同的原因h = h * 2
如果您想了解有关此主题的更多信息,请务必查看数据模型链接.
该赋值确实使h指向与l相同的项目。然而,它并没有将两者永久焊接在一起。当您使用h = h * 2更改h时,您告诉 Python 在内存中的其他位置构建双倍版本,然后使h指向双倍版本。您尚未发出任何更改l的指示;仍然指向原始项目。