【发布时间】:2018-07-10 20:52:37
【问题描述】:
根据this,python 在切片时复制引用。我尝试了以下方法:
>>> a=[1,2,3]
>>> b=a[:]
>>> b[1]=0
>>> a
[1, 2, 3]
>>> b
[1, 0, 3]
>>> map(id,a)
[14508376, 14508352, 14508328]
>>> map(id,b)
[14508376, 14508400, 14508328]
为什么b[1]=0 不会改变a[1](如果b[1] 确实是对同一对象的引用,可能会是这种情况)?相反,它似乎生成了一个新的引用/id 并更改了新对象。我可以在哪里更详细地了解此行为?
【问题讨论】:
-
Assignment 也会复制引用。见nedbatchelder.com/text/names.html。
-
b[1]=0更改引用,而不是引用的对象。所以现在这两个列表有不同的引用。当您看到更改反映在列表中时,这并不是因为b中引用的更改更改了a中的引用,而是因为a和b中引用的对象都已更改。画一些带有箭头的图片代表参考,它确实有帮助。 -
@user2357112 是的,但行为不同
-
与什么不同?如果您是这样想的话,这肯定与复制引用的行为没有什么不同。
-
@user2357112 我的意思是
c=a(赋值),c[1]=0导致a成为[1,0,3],不像使用切片时a[:]
标签: python list reference slice