python中,一些看似相似的函数之间却有着很大的区别,比如is , = , ==
我们从例子来看
a =1 表示将1赋值给a
a == 1 表示判断a是否等于1
a is 1 表示a 与1是否为相同的对象。
对于b同理。
我们会发现一些比较意外的结果。对于一个整数,我们可以很容易通过多种方式来确定相等。然而对于列表对象,我们发现is的表现与其他比较操作符不同。
接下来我们从另一个角度观察。
定义了一个变量a,并将其赋值为1,将a 赋值给b。使用id方法查看他们再内存中的位置,看2和6的地方,他们都使用了内存中相同的位置,也就是说它们再内存中是相同的对象。
重新给a赋值为2后,会发现它在内存中有了新的位置箭头3。
在列表中,我们会发现列表拥有和赋值对象相同的id值。
当我们改变这个列表的时候,发现并不能改变内存中的位置。在python中,列表表现得与字符串和整数略有不同。
我们所需要知道和理解的是,在我们将它赋值给一个新变量的时候,新变量和旧的变量仍然是内存中的相同对象。如果我们改变了一个,也改变了另一个。如果想要改变其中一个或者另外一个,或者需要创建一个新的对象作为对象的副本,需要使用copy方法。
还是举个例子来说明:
在左边的代码中我们可以看到,当修改了a时,b的值也发生了变化,因为他们存储在内存中想同的位置。
在右边的代码中我们使用copy()方法创建了一个新的变量c,这是第一个字典的副本。在修改了c之后,我们看到它现在保存这两个键值对。但是会发现b的值没有变化。
最后我们总结一下:如果你想要一个字典或者列表的副本,需要使用copy方法。如果你想要相同的对象,可以使用=。如果你想要知道两个对象是不是‘相等的’,可以使用==,如果你想知道他们是否是相同的对象,可以使用is。
最后推荐一篇文章,使用可视化的方式来理解,http://foobarnbaz.com/2012/07/08/understanding-python-variables/