版权声明:本文为博主原创文章,转载请注明原文链接。 https://blog.csdn.net/Frank_Abagnale/article/details/82460953
这篇笔记主要记录,列表作为函数参数传递时的深浅拷贝问题
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
这篇笔记主要记录,列表作为函数参数传递时的深浅拷贝问题
'''
import copy
def list_append(l=[]):
l.append([0,0,0])
def list_obj_append(l=[]):
l[4].append(100)
def print_all_list(a=[],b=[],c=[],log=''):
print log
print "a:", a
print "b:", b
print "c:", c
if __name__ == "__main__":
a = [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
b = [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
c = [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
print_all_list(a,b,c,"原始list:");
print "操作:.append([0,0,0])"
list_append(a)
list_append(copy.copy(b))
list_append(copy.deepcopy(c))
print_all_list(a,b,c,"对list添加元素,a为赋值、b为浅拷贝、c为深拷贝")
list_obj_append(a)
list_obj_append(copy.copy(b))
list_obj_append(copy.deepcopy(c))
print_all_list(a, b, c, "对list添加元素,a为赋值、b为浅拷贝、c为深拷贝")
## 可见列表、字典等作为函数的参数如果不用拷贝直接赋值,仍然是索引方式
## 字典作为函数参数也类似
'''
输出:
原始list:
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
操作:.append([0,0,0])
对list添加元素,a为赋值、b为浅拷贝、c为深拷贝
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
对list添加元素,a为赋值、b为浅拷贝、c为深拷贝
a: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
'''
另外,列表作为函数的参数,还有一种情况需要考虑:
函数定义时的默认参数发生改变的情况,既对默认参数进行了append/remove等操作,
字典也有可能发生例如对键的值进行修改的情况
'''
另外,列表作为函数的参数,还有一种情况需要考虑:
函数定义时的默认参数发生改变的情况,既对默认参数进行了append/remove等操作,
字典也有可能发生例如对键的值进行修改的情况
'''
def get_square_list(num=0, l=[], dic={}):
for i in range(num):
l.append(i**2)
pass
dic[num] = l
print "list:",l
print "dict:",dic
print "l id:",id(l)," | dic id:",id(dic)
def new_get_square_list(num=0, l=[], dic={}):
if not l :
l = []
if not dic :
dic = {}
for i in range(num):
l.append(i**2)
pass
dic[num] = l
print "list:",l
print "dict:",dic
print "l id:",id(l)," | dic id:",id(dic)
if __name__ == "__main__":
print "ERROR!!:get_square_list"
get_square_list(2)
get_square_list(3)
'''
输出:
ERROR!!:get_square_list
list: [0, 1]
dict: {2: [0, 1]} ## 第一次执行的值是正常的,
l id: 140431170632088 | dic id: 140431170705680
list: [0, 1, 0, 1, 4] ## 第二次的结果累加了前一次的结果。
dict: {2: [0, 1, 0, 1, 4], 3: [0, 1, 0, 1, 4]}
l id: 140431170632088 | dic id: 140431170705680 ## 发现两次调用的变量id是同一个,
## 也就是说,append和修改字典值的过程
## 对变量默认值进行了修改。
'''
print "**优化**"
new_get_square_list(2)
new_get_square_list(5)
'''
**优化**
list: [0, 1]
dict: {2: [0, 1]}
l id: 140476922003328 | dic id: 140476921956344
list: [0, 1, 4, 9, 16]
dict: {5: [0, 1, 4, 9, 16]}
l id: 140476922003328 | dic id: 140476921956344
'''