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]