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,

我是Python的初学者,我正在学习Mark Lutz的《学习Python第五版》一书

在研究范围界定和对象引用时,我遇到了一件我完全不理解的事情。我理解,当您将一个对象分配给另一个对象时,它们只是共享对同一地址的引用,除非您执行顶级复制。但是,我注意到,当您“嵌套”对象时,两个对象不再共享同一地址

比如说,

>>> 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
    的元素;它将引用复制到元素。