This topic created in 3310 days ago, the information mentioned may be changed or developed.
root = []
root[:] = [root, root, None]
root
>>> [[...], [...], None]
root = []
root = [root, root, None]
root
>>> [[], [], None]
哪位 juju 可以深入浅出的解释一下,多谢多谢。
Supplement 1 · May 4, 2017
我明白了 ,谢谢大家的解答。
6 replies • 2017-05-04 18:39:32 +08:00
 |
|
1
XYxe May 4, 2017 via Android 1
第一种情况的两个 root 是同一个 list 的引用。 第二种情况是创建了一个新的 list,元素是[root, root, None],这时候的 root 是[],然后把 root 指向这个对象,但是新 list 的前两个元素还是指向原来的那个[]。
|
 |
|
3
buckyRRRR May 4, 2017
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] ,然后会无限循环下去
|
 |
|
4
thekoc May 4, 2017
几种写法的比较: 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 本身引用的对象变为了另一个对象。
|
 |
|
5
ziyo12580 May 4, 2017
@ thekoc b = [1,2] id(b) # Out[59]: 4459173000 b[0:2] = [b,b,None] id(b) # Out[61]: 4459173000 引用对象没变吧
|
 |
|
6
thekoc May 4, 2017
@ ziyo12580 #5 笔误,应该是 124,root 引用的还是同一个对象,但是对象里面的内容变了。3 则是 root 本身引用的对象变为了另一个对象。
|