python赋值与变量误区,is 和 == 的陷阱

很多时候,对变量的赋值容易产生误区,如果对其理解的不透彻,会对程序产生意想不到的效果。。。
 
在python中,对于不可变变量与可变变量的赋值,是不一样的,比如b=a,就是将a的地址索引传递给b,b和a其实指向同一个对象。如果这个对象是可变的,那么a和b任何一个变量发生修改,另外一个变量也随之修改。
 
但对不可变变量,如果在代码中第一次声明,如a = 500,则不一样。它将新开辟了一块地址,并将这个地址绑定给这个变量a,如果再次有变量获得这个相同的值,但这个地址将是固定的!也就是说如果再使得c=500,那么c也会获得这个地址,它将和a指向同一个变量,这是python本身节约内存的一种方法。
 
然而这种声明只针对字符串和数字等不可变变量有效,针对列表或元组之类将无法产生效果。
 
比如:A = [1,3,5]   B=[1,3,5],那么他们两个的地址将是不同的!因为python内部代码中,每次声明列表等可变变量,都会开辟一块新的地址,并将其赋值于变量。
这么做的原因其实也很好理解,比如A = [1,3,5] ,B=A,那么A.append(3),B也会发生变化,符合逻辑,但如果A = [1,3,5] , B=[1,3,5],如果像不可变变量一样分配相同的地址,那么 A.append(3)将会使得B的列表值也发生改变!这将在逻辑上产生严重的错误。
 
而不可变变量,是无法对其进行修改的,其值将是固定的,每次为其赋新值只是重新分配值而已,而不是在原有值的基础上修改值,所以每次为其新开辟地址,在逻辑上就不会错误了。
 
但对于不可变变量,如果这个值事先被声明过,但另外一个相同的值是从其他地方获取的并赋值给一个变量的,比如爬取,那么这个值将不会和原始声明的相同值分配相同的地址!
 
比如从爬取网页上的500这个值并将其赋值给data,并且你也事先声明过c=500,但其两个相同值的地址将不同!这时如果使用is判断,会获得一个错误的返回值,而使用==判断,会获得一个正确的返回值。

 

 

发布了13 篇原创文章 · 获赞 17 · 访问量 5410
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章