python浅拷贝和深拷贝

在本章中,我们将讨论如何复制列表和嵌套列表的问题。我们将遇到的问题是可变数据类型的一般问题。尝试复制列表对于新手来说可能是一种难堪的体验。但在此之前,我们想总结一下上一章“数据类型和变量”的一些见解。在分配和复制简单数据类型(如整数和字符串)时,Python 甚至会为该语言的初学者展示一种奇怪的行为 - 与其他一些传统编程语言相比。浅拷贝和深拷贝之间的区别仅与复合对象有关,即包含其他对象的对象,如列表或类实例。

 

在下面的代码片段中,y 指向与 X 相同的内存位置。我们可以通过在 x 和 y 上应用 id() 函数来看到这一点。然而,与 C 和 C++ 中的“真实”指针不同,当我们为 y 分配一个新值时,情况会发生变化。在这种情况下, y 将收到一个单独的内存位置,正如我们在“数据类型和变量”一章中看到的,并且可以在以下示例中看到:

x  =  3 
y  =  x
打印( id ( x ),  id ( y )) 

输出:

94308023129184 94308023129184
y  =  4
打印( id ( x ),  id ( y ))

输出:

94308023129184 94308023129216
打印( x , y )

输出:

3 4

但是,即使与 C、C++、Perl 或 Java 等编程语言相比,这种内部行为看起来很奇怪,但前面赋值的可观察结果正是我们所期望的,即如果您不查看 id 值。但是,如果我们复制列表和字典等可变对象,则可能会出现问题。

Python 只创建真正的副本,如果它必须,即如果用户,程序员,明确要求它。

我们将向您介绍最关键的问题,这些问题在复制列表和字典等可变对象时可能会发生。

共享对象的变量

您在此页面上了解如何复制对象,尤其是列表。然而,你需要锻炼耐心。我们想向许多初学者展示一些看起来像副本但与副本无关的东西。

colours1  =  [ "red" ,  "blue" ] 
colours2  =  colours1 
print ( colours1 ,  colours2 )

输出:

['红色','蓝色'] ['红色','蓝色']

两个变量都引用同一个列表对象。如果我们查看变量colours1and的身份colours2,我们可以看到两者都是对同一个对象的引用:

你可能感兴趣的:(python)