Python中的引用和作用域
我是Python的初学者,我正在学习Mark Lutz的《学习Python第五版》一书 在研究范围界定和对象引用时,我遇到了一件我完全不理解的事情。我理解,当您将一个对象分配给另一个对象时,它们只是共享对同一地址的引用,除非您执行顶级复制。但是,我注意到,当您“嵌套”对象时,两个对象不再共享同一地址 比如说,Python中的引用和作用域,python,object,sharedpreferences,scoping,Python,Object,Sharedpreferences,Scoping,我是Python的初学者,我正在学习Mark Lutz的《学习Python第五版》一书 在研究范围界定和对象引用时,我遇到了一件我完全不理解的事情。我理解,当您将一个对象分配给另一个对象时,它们只是共享对同一地址的引用,除非您执行顶级复制。但是,我注意到,当您“嵌套”对象时,两个对象不再共享同一地址 比如说, >>> L = [4, 5, 6] >>> X = L * 4 # Like [4, 5, 6] + [4, 5,
>>> L = [4, 5, 6]
>>> X = L * 4 # Like [4, 5, 6] + [4, 5, 6] + ...
>>> Y = [L] * 4 # [L] + [L] + ... = [L, L,...]
>>> X
[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> Y
[[4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6]]
>>> L[1] = 0 # Impacts Y but not X
>>> X
[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> Y
[[4, 0, 6], [4, 0, 6], [4, 0, 6], [4, 0, 6]]
这是我不明白的部分。
为什么更改L对象会影响Y而不是X?您有两种不同的情况:
X=L*4
创建一个包含L
元素4个副本的新列表Y=[L]*4
创建一个包含对L
的4个引用的新列表。所以你最终会得到这样的结果:Y=[L,L,L,L]
因为
L
不包含在X
L*4
中,所以不会复制L
的元素;它将引用复制到元素。