代码之家  ›  专栏  ›  技术社区  ›  l7ll7

当通过组合部分旧数据结构来构建数据结构时,Python总是进行浅层复制吗?

  •  0
  • l7ll7  · 技术社区  · 6 年前

    如果我用列表中的一些现有元素创建一个新列表,python会将这些项复制到新列表中吗?

    structure = [] 
    structure.append([pd.read_excel("df1.csv"), item1]) #contains a large dataframe, df1, and some other object, item1
    structure.append([pd.read_excel("df2.csv"), item2]) #analoguous
    
    lst = [structure[0][0]["some_column1"], structure[1][0]["some_column2"]] #here we save just the dataframe
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   gilch    6 年前

    Python中的变量总是对堆上的对象的引用(智能指针)。Python中没有像C中那样存在于堆栈上的对象的概念。在Python中为一个值指定一个新名称并不会复制它,它只是向对象添加了一个引用。

    Python列表同样是这些引用的列表。将现有堆对象放入Python列表只会添加对它的引用。它不会复制它。这个 foo.copy() foo[:] 全切片(其中 foo list(foo) [*foo] 是肤浅的复制品。中有一个deepcopy函数 copy 模块,如果你需要的话。

    从这样的数组中获取一个值意味着将该值的副本作为堆对象,以便Python可以直接引用它。当然,您可以将数组作为一个整体进行新的引用,方法是将它赋给一个新变量或将它放入一个列表中。当然,这根本不是数组的拷贝。


    所以,只是确认一下,这意味着我的lst是大熊猫结构部分的深度复制品?

    熊猫的大多数操作都会复制,除非你使用 inplace=True 参数(对于某些操作甚至不可用)。当然,对索引的赋值是适当的,但要注意间接的 chained indexing ,这可能最终会指定给一个副本。

    尝试 为了提高效率而使用视图,但与它所基于的Numpy数组一样,这并不总是可能的(例如当对象有多个数据类型时)。在不知道数据帧结构的情况下,我无法确定哪一个适用,甚至可能不知道,但我最好的猜测是,这将是一个浅拷贝。在简单的情况下很难预测,这可能取决于选择的内存布局,这是一个实现细节,可能会在不通知的情况下更改。别指望了。显式地使用copy方法。