Python-共享引用

 A会改变么?

下面三小段代码,A的值都会改变么?

>>> A = "spam"
>>> B = A
>>> B = "shrubbery"

 

>>> A = ["spam"]
>>> B = A
>>> B[0] = "shrubbery"

 

>>> A = ["spam"]
>>> B = A[:]
>>> B[0] = "shrubbery"

 

 分析:

“python中一切都是对象”

整数也好,字符串也罢,都是对象。这里,字符串"spam"、列表["spam"]、字符串"shrubbery"都是对象,而A和B则是这里对象的引用,引用可以理解成对这个对象的地址,或者这个对象的名字。

对象又分为可变对象和不可变对象:

  • 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
  • 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变

Python中,数值类型(intfloat)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。


OK,有了上面的认识,我们就可以撸开袖子分析了。

工欲善其事,必先利其器。一个函数可以帮我们分析A和B是否引用的同一个对象--id(),id()函数用于获取对象的内存地址

 

posted @ 2018-04-26 21:27  ralap7  阅读(335)  评论(0编辑  收藏  举报