直接上代码:
>>> lst1 = [1, 2, 3]
>>> lst2 = lst1
>>> lst3 = lst1
>>> id(lst1)
2241808741576
>>> id(lst2)
2241808741576
>>> id(lst3)
2241808741576
>>> lst2 += [4, 5]
>>> print(lst2)
[1, 2, 3, 4, 5]
>>> print(lst1)
[1, 2, 3, 4, 5]
>>> print(lst3)
[1, 2, 3, 4, 5]
>>> id(lst2)
2241808741576
>>> id(lst1)
2241808741576
>>> id(lst3)
2241808741576
- 每个标识符与其所引用的对象的内存地址隐式相关联。python标识符 (可理解为变量名) 的语义非常类似于Java中的引用变量或C++中的指针变量。
- lst1、lst2、lst3都是列表类对象 [1, 2, 3] 的别名,一旦建立了别名,这三个别名都可用来访问底层对象,即列表[1, 2, 3]
- +=对于列表类型的操作:
- 执行了,lst2 += [4, 5],由上面的IDLE运行结果发现,lst2的地址与执行命令之前是相同的,都是2241808741576,说明,列表对象在原地扩展了两个元素4,5.
>>> lst3 = lst3 + [6, 7]
>>> print(lst3)
[1, 2, 3, 4, 5, 6, 7]
>>> print(lst1)
[1, 2, 3, 4, 5]
>>> print(lst2)
[1, 2, 3, 4, 5]
>>> id(lst3)
2241808979208
>>> id(lst1)
2241808741576
>>> id(lst2)
2241808741576
上下代码段是连在一起的
- =对于列表的操作:
- 现在st1、lst2、lst3所指向的对象值为 [1, 2, 3, 4, 5]
- 执行lst3 = lst3 + [6, 7],发现lst3结果为 [1, 2, 3, 4, 5, 6, 7],lst1和lst2的结果依然为 [1, 2, 3, 4, 5]
- 查看lst1、lst2、lst3的id可知,lst1和lst2的地址依然没有改变,lst3的地址发生了改变
- lst3 = lst3 + [6, 7] 并没有改变原有对象的值,而是新构造的对象 [1, 2, 3, 4, 5, 6, 7] 重新分配标识符(lst3),此时lst3不在是原对象的别名,是新构造对象的别名
- 在列表类型中,+= 与 = 的对比:+=是在原地扩展元素,=是构造新的对象,只是变量名依旧是原来的变量名(如lst3)
- 对于不可变类型,如数字或字符串,+=并没有改变现有对象的值,而是构造了新的值重新分配了标识符。+=在列表(可变类型)中是一个特殊的情形。