Python 列表&字典作为函数的参数

版权声明:本文为博主原创文章,转载请注明原文链接。 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
'''

猜你喜欢

转载自blog.csdn.net/Frank_Abagnale/article/details/82460953
今日推荐