关于 Python 列表的值赋值,和地址赋值的一个问题

2017-05-04 10:53:55 +08:00
 chaleaoch
root = []
root[:] = [root, root, None]
root
>>> [[...], [...], None]
root = []
root = [root, root, None]
root
>>> [[], [], None]

哪位 juju 可以深入浅出的解释一下,多谢多谢。
2289 次点击
所在节点    Python
6 条回复
XYxe
2017-05-04 11:06:50 +08:00
第一种情况的两个 root 是同一个 list 的引用。
第二种情况是创建了一个新的 list,元素是[root, root, None],这时候的 root 是[],然后把 root 指向这个对象,但是新 list 的前两个元素还是指向原来的那个[]。
lilydjwg
2017-05-04 11:10:51 +08:00
buckyRRRR
2017-05-04 12:04:19 +08:00
root =[]
创建一个空列表对象,假设地址是 11111,root 变量存这个地址


root[:] = [root, root, None]
1.先执行[root, root, None] ,创建一个含三个元素的列表对象,地址假设为,22222,其中前两个 root 变量存的是 11111 这个地址,
2.执行 root[:],复制一个空列表对象,把这个新对象地址存在 root 变量里,因为是复制出来的是新对象,所以 root 里存的地址从 11111 变成 33333 (假设)
3.进行赋值 root 存的地址存 33333 变成 22222,也就是指向[root, root, None] ,而此时[root, root, None] 里面的 root 又指向[root, root, None] ,然后会无限循环下去
thekoc
2017-05-04 12:58:17 +08:00
几种写法的比较:
root = [1, 2]
root[:] = [root, root, None]

root = [1, 2]
root[0:2] = [root, root, None]

root = [1, 2]
root = [root, root, None]

root = [1, 2]
root[0] = [root, root, None]

1、3、4 都是一样的,root 引用的还是同一个对象,但是对象里面的内容变了。2 则是 root 本身引用的对象变为了另一个对象。
ziyo12580
2017-05-04 17:56:07 +08:00
@thekoc
b = [1,2]
id(b)
# Out[59]: 4459173000
b[0:2] = [b,b,None]
id(b)
# Out[61]: 4459173000

引用对象没变吧
thekoc
2017-05-04 18:39:32 +08:00
@ziyo12580 #5

笔误,应该是 124,root 引用的还是同一个对象,但是对象里面的内容变了。3 则是 root 本身引用的对象变为了另一个对象。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/359022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX