python 列表和字典的引用与复制(copy)

Posted 另一个起点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 列表和字典的引用与复制(copy)相关的知识,希望对你有一定的参考价值。

列表或字典的引用:

引用针对变量的时候,传递引用后,对引用后的对象的值进行改变是不会影响到原值的;而列表不一样如:

spam =42

cheese = spam

spam =100

print(spam)      #out:100

print(cheese)   #out:42

 

如果对列表进行引用会是什么情况呢,我们来看看

spam = [0,1,2,3,4,5]
cheese = spam
print(spam)
cheese[1] = ‘hello‘
print(spam)
print(cheese)

out:

[0, 1, 2, 3, 4, 5]
[0, ‘hello‘, 2, 3, 4, 5]
[0, ‘hello‘, 2, 3, 4, 5]

结果我们发现cheese 是引用的spam的,我们改变cheese之后 spam的值也跟着改变了;这个就跟我们当初学的C语言一样;列表的引用其实就是相当于把前面一个列表的地址同时给了一个新的列表用。结果这两个列表都指向了同一地址而这个地址里面本身就只能存放一组数据,不管是对这两个列表谁进行操作都会把这个地址中的数据重新更新;也因此列表可以用来形参的传递来改变实参的值,而变量不同,变量的形参传递是不会改变实参的值的;

def eggs(somePrameter):
  somePrameter.append(‘Hello‘)


def trees(somename):
   somename+=‘Hello‘
   print(‘形参值:‘+somename)

 

spam = [0,1,2,3]
treename = ‘梧桐‘
eggs(spam)
trees(treename)
print(spam)
print(‘实参值:‘+treename)

out:

形参值:梧桐Hello
[0, 1, 2, 3, ‘Hello‘]
实参值:梧桐

列表或字典的复制

   在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表和字典,你可能不希望这些变动影响到原来的列表或字典。要做到这一点,Python提供了copy的模块,其中包含copy()和deepcopy()函数。第一个函数copy.copy(),可以用来复制列表或字典这样的可变值,而不是复制引用.注意这需要用到copy模块,因此要import copy

如上示例做些许更改所示:

import copy
spam = [0,1,2,3,4,5]
cheese = copy.copy(spam)
print(spam)
cheese[1] = ‘hello‘
print(spam)
print(cheese)

out:

[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]
[0, ‘hello‘, 2, 3, 4, 5]

 

以上是关于python 列表和字典的引用与复制(copy)的主要内容,如果未能解决你的问题,请参考以下文章

流畅的python第八章对象引用,可变性和垃圾回收

python模块之copy

python深拷贝和浅拷贝的区别

python 深复制与浅复制------copy模块

python之列表/元组/字典/字符串

Python中的深浅拷贝,赋值及引用