ama*_*ndi 3 python list mutable
当我输入以下代码时
x=[1,2,4]
print(x)
print("x",id(x))
x=[2,5,3]
print(x)
print("x",id(x))
Run Code Online (Sandbox Code Playgroud)
它给出了输出
[1, 2, 4]
x 47606160
[2, 5, 3]
x 47578768
Run Code Online (Sandbox Code Playgroud)
如果列表是可变的,那么为什么在更改列表x时它会给出2个内存地址?
iCo*_*dez 14
您没有x
使用此行变异(更改)引用的列表对象:
x=[2,5,3]
Run Code Online (Sandbox Code Playgroud)
相反,该行创建一个新的列表对象,然后将变量重新分配x
给它.所以,x
现在引用新对象并id(x)
给出与以前不同的数字:
>>> x=[1,2,4] # x references the list object [1,2,4]
>>> x
[1, 2, 4]
>>> x=[2,5,3] # x now references an entirely new list object [2,5,3]
>>> x
[2, 5, 3]
>>>
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 14
您创建了一个新的列表对象并将其绑定到相同的名称x
.您从未改变x
过一开始绑定的现有列表对象.
Python中的名称只是引用.赋值是将名称绑定到对象.x
再次分配时,您将该引用指向另一个对象.在您的代码中,您只需创建一个全新的列表对象,然后反弹x
到该新对象.
如果要改变列表,请调用该对象上的方法:
x.append(2)
x.extend([2, 3, 5])
Run Code Online (Sandbox Code Playgroud)
或分配给列表的索引或切片:
x[2] = 42
x[:3] = [5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
演示:
>>> x = [1, 2, 3]
>>> id(x)
4301563088
>>> x
[1, 2, 3]
>>> x[:2] = [42, 81]
>>> x
[42, 81, 3]
>>> id(x)
4301563088
Run Code Online (Sandbox Code Playgroud)
我们更改了列表对象(变异了),但该id()
列表对象的内容没有改变.它仍然是相同的列表对象.
也许Ned Batchelder对Python名称和绑定的出色表现可以提供帮助:关于Python名称和值的事实和神话.
归档时间: |
|
查看次数: |
27612 次 |
最近记录: |