对于Python的初学者,在对象的使用过程中,由于对变量的赋值和对象的复制中的概念模糊,导致程序出错。 例如,下面的代码:a〔1,2,3,4,5〕bac〔1,2,3,4,5〕b〔0〕6print(a{},b{},c{}。format(a,b,c))print(a等于b?{}。format(ab))print(a等于c?{}。format(ac))print(a是b?{}。format(aisb))print(a是c?{}。format(aisc)) 输出结果为: a〔6,2,3,4,5〕, b〔6,2,3,4,5〕, c〔1,2,3,4,5〕 a等于b?True a等于c?True a是b?True a是c?False 可以看到,a,b,c所指向的对象的值都相同(ab为True)。a和b都是代表同一个对象(aisb为True)。当我们通过变量b对该列表进行修改时,由于a也指向该列表,所以当打印a,b时,我们得到相同的值。而a和c则是代表不同的对象(aisc为False),所以修改b所指向得列表不会改变c梭子乡的列表的值。 在Python中,所有的变量都代表了对象,即便是简单的数字类型(int,float,bool),也是以对象的形式存在的。我们看下面的代码:a1baprint(ab为{}。format(ab))print(aisb为{}。format(aisb)) 输出结果是: ab为True aisb为True 可见,a,b都是指向同一个对象。接下来,进行下面的操作,bb1print(a{},b{},a,b)print(aisb为{}。format(aisb) 输出结果是: a1,b2 aisb为False 与前面的列表不同,当我们对b做修改时,实际上是给b赋予了一个新生成的对象,对数值类型来说,所有的数值运算都会创建一个数值对象,并将这个对象指定给变量。因此,a与b指向了不同的对象,数值也不同。 再回过头来看列表对象,a〔1,2,3,4,5,6〕bab〔0〕1print(a{},b{}。format(a,b)) 我们知道,b是与a指向同一对象的变量,使用b对该对象进行修改,与使用a对该对象进行修改,效果是完全一样的。如果我们需要需要一个与a完全相同又与a相互独立的列表,那么就需要复制这个对象,也就是新建一个内容和源对象相同的对象。 对于列表来说,最简单的复制方法是通过下标索引的方式创建新的列表:a〔1,2,3,4,5,6〕ba〔:〕print(a,a)print(b,b)print(aisb为,aisb) 对于各种数据类型通用的对象拷贝复制,我们可以使用python內建的copy模块。importcopya〔1,2,3,4,5〕bcopy。copy(a)print(a,a)print(b,b)print(aisb为,aisb) 对于复杂对象(如嵌套列表)的复制,则需要注意区分浅拷贝和深拷贝。我们来看下面的代码:importcopya〔〔1,2,3〕,〔4,5,6〕〕bcopy。copy(a)ccopy。deepcopy(a)print(a〔0〕isb〔0〕为,a〔0〕isb〔0〕)print(a〔0〕isc〔0〕为,a〔0〕isc〔0〕)b〔1〕〔7,8,9〕b〔0〕〔0〕1print(a,a)print(b,b)print(c,c)print(a〔1〕isb〔1〕为,a〔1〕isb〔1〕) 得到的结果是: a〔0〕isb〔0〕为True a〔0〕isc〔0〕为False a〔〔1,2,3〕,〔4,5,6〕〕 b〔〔1,2,3〕,〔7,8,9〕〕 c〔〔1,2,3〕,〔4,5,6〕〕 a〔1〕isb〔1〕为False 从上面的代码我们可以看到,copy函数为浅拷贝,只拷贝了对象的外层,而对象内部所包含的对象仍然指向原有的对象。而deepcopy则为深拷贝,对象内部的对象也进行了复制。 以上我们对变量的赋值和对象的复制做了更加深入的分析。在具体的使用中,我们需要根据具体来决定使用赋值、浅拷贝、深拷贝。