【问题标题】:Multi-Referenced Nested Lists多引用嵌套列表
【发布时间】:2014-01-19 20:36:00
【问题描述】:

我在看这个人的帖子: https://stackoverflow.com/a/2573965/1959054

他说的是通过询问人们以下代码的输出来测试人们的 Python 熟练程度:

x = 42
y = x
x = x+1
print x
print y

x = [1,2,3]
y = x
x[0]=4
print x
print y

我成功地预测了这两个输出,刚刚在一本书中阅读了关于可变列表和不可变字符串的类似场景。然后他举了这个例子:

x = ["foo",[1,2,3],10.4]
y = list(x)
y[0] = 'foooooo'
y[1][0] = 4
print x
print y

这让我很困惑。你看,我预测x 会打印为["foo",[1,2,3],10.4]y 会打印为["foooooo",[4,2,3],10.4]

x 实际上打印为["foo",[4,2,3],10.4],这意味着即使外部列表引用不同的list 对象,x[1]y[1] 的内部列表仍然引用同一个对象。

我以前没有遇到过。

我的主要问题是,如果你想让y 等同于x,但不引用相同的列表,并且还要确保任何嵌套列表也没有引用相同的列表,你怎么做那? y = list(x) 似乎只处理外部列表。

我的第二个问题是从概念上获得任何帮助来理解为什么会这样。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    copy.deepcopy() 回答了您的第一个问题,其中 (docs):

    构造一个新的复合对象,然后递归地将原始对象的副本插入其中。

    from copy import deepcopy
    y = deepcopy(x)
    

    至于为什么会发生这种情况,list()(以及常见的slice 复制x[:])的标准列表构造只创建了一个浅拷贝,即(再次强调我的文档):

    构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中。

    【讨论】:

    • 谢谢,我想你已经为我打中了钉子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多