sunsir 发表于 2017-4-29 09:38:32

python 引用与复制

  在python中,任何不可变对象是传值的,而可变对象是传引用的。
  不管是向函数传递参数或者是任何形式的对象复制来说,不可变对象(比如整数,字符串)被真正复制,而可变对象只是复制了一个对他们的引用,即在内存中只有一份对象,而引用两份。
  a=b 这样的赋值,就会创建对b的引用,对于象数字和字符串这样的不可变的对象,这种赋值实际是创建了b的一个副本
  >>> a='hello'
  >>> b=a
  >>> id(a)
  29326432
  >>> id(b)
  29326432
  >>> b is a
  True
  >>> a=1000
  >>> b
  'hello'
  对于可变对象,比如字典和列表,a和b引用的是同一个对象,修改其中任意一个变量都会影响到另一个。
  >>> a=
  >>> b=a
  >>> id(a)
  29280896
  >>> id(b)
  29280896
  >>> b='ccccccccc'
  >>> a
  
  >>> 
  列表和字典这样的容器对象,可以使用两种赋值操作:浅复制和深复制。浅复制创建一个新对象,但它包含的是对原始
  对象中包含的项的引用。
  比如下面的浅复制:
  >>> a=]
  >>> b=a
  >>> a=]
  >>> b=list(a)
  >>> b is a
  False
  >>> b=1000
  >>> b
  ] #注意,b修改了b以后,对a没有影响
  >>> a
  ]
  >>> b='cccc'   #注意,b修改了 b以后,对a有影响
  >>> b
  ]
  >>> a
  ]
  深复制将创建一个新对象,并且递归的复制它包含的所有对象,没有内置对象可以创建深复制,可以使用copy.deepcopy()函数完成。
  >>> import copy
  >>> a=]
  >>> b=copy.deepcopy(a)
  >>> id(b)
  29582240        
  >>> id(a)
  29581840
  >>> a is b
  False
  >>> b=1000
  >>> b
  ]          #注意修改了b之后对a没有影响
  >>> a
  ]
  >>> b='gggg'
  >>> b
  ]  #修改了 b之后对a也没有影响,这是和浅复制的区别
  >>> a
  ]
页: [1]
查看完整版本: python 引用与复制