我们假设我执行以下操作:
>>> id(a)
139926795932424
>>> a
[1, 2, 3, 4]
>>> a = a + [5]
>>> id(a)
Run Code Online (Sandbox Code Playgroud)
这个脚本的最后一行是打印139926795932424吗?或者新的id将被分配给a?
这个脚本的最后一行是打印139926795932424吗?或者将新的ID分配给?
将分配一个新的ID a.为什么?因为a指的是不同的对象.
a = a + [5]是语法糖a = a.__add__([5]),并且因为a.__add__([5])返回一个新对象,它a保存对新对象的引用而不是旧对象.这可以通过一个简单的例子来观察:
>>> a = [1, 2]
>>> b = a # copy the reference in a to b
>>> id(a) == id(b) # they match
True
>>> a = a + [5] # syntatic sugar for a = a.__add__([5])
>>> id(a) == id(b) # they no longer match
False
>>>
Run Code Online (Sandbox Code Playgroud)
请注意,在这个意义上,a = a + [5]和a += [5]是不是即使它们产生相同的结果相同(a = [1, 2, 5]).如上所述的第一个例子是用于的语法糖a = a.__add__([5]).而第二个是语法糖a = a.__iadd__([5]).所不同的是后一种方法- __iadd__()-并没有在存储器中创建新的对象.相反,它修改现有的列表对象,并返回对它的引用.再次像以前一样:
>>> a = [1, 2]
>>> b = a # copy the reference in a to b
>>> id(a) == id(b) # they match
True
>>> a += [5]
>>> id(a) == id(b) # they still match, `b` has mutated too!
True
>>> b
[1, 2, 5]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
561 次 |
| 最近记录: |