python函数是值传递还是引用传递

答案: 都不是, 应该是传对象或对象的引用

函数参数在传递的过程中将整个对象传入,对可变对象的修改在函数外部以及内部都可以见,调用者和被调用者之间共享这个对象,而对于不可变对象,
并不能真正被修改,因此,修改往往是通过生成一个新对象然后赋值来实现的.

def change_me(org_list):
  print(id(org_list))
  new_list = org_list
  print(id(new_list))

  if len(new_list) > 5:
    new_list = ['a', 'b', 'c']

  for i,e in enumerate(new_list):
    if isinstance(e, list):
      new_list[i] = "***"

  print(new_list)
  print(id(new_list))

分别找两个list作为参数尝试一下

警惕函数默认参数潜在的问题

默认参数可以给函数的使用带来很大的灵活性,当函数没有指定形参对应的实参就会自动使用默认参数.

def append_test(new_item, lista = []):
  print(id(lista))
  lista.append(new_item)
  print(id(lista))
  return lista

连续调用两次append_test(1), append_test("a") 函数返回值会怎样呢?

期望是 [1]、[‘a’]

实际: [1], [1, ‘a’]

如果不想让默认参数所指向的对象在所有的函数调用中被共享,而是函数调用过程中动态生成,可以在定义的时候设置为None对象作为占位符

原文地址:http://www.cnblogs.com/zyl007/p/16886988.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性