• python传参是传值还是传引用


    在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的。例如,a = []是一个空列表对象,变量 a 是该对象的一个引用
    例1
    def test(c):
     c.append("hello world")
     print(c,id(c))
     return
    list = [1,2]
    test(list)
    print(list,id(list))
    输出
    [1, 2, 'hello world'] 2463790879240
    [1, 2, 'hello world'] 2463790879240
    在执行test函数前,列表list和参数c都指向同一个对象,执行test时并没有重新赋值,也没有新的指向过程,append方法只是对列表对象插入一个元素,对象还是原来的对象,只是对象里面的内容变了,因为参数c和列表list都是绑定同一个对象上,执行c.append和list.append方法本质都是对一个对象进行操作,因此list列表在调用函数后发生了变化,但id没变,还是原来那个对象。因此,如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象
     
    例2
    def test2(p):
    p = "i in test2"
    print(p,id(p))
    str = "hello word"
    test2(str)
    print(str,id(str))
    输出:
    i in test2 2885210784112
    hello word 2885210784048
    id不一样,所以说不是同一个对象,也就是说我们传的还是引用。因此,如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象
     
    总结:
    Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
     
    参考:http://www.cnblogs.com/loleina/p/5276918.html
     
     
  • 相关阅读:
    在VMware上安装CentOS-6.5 minimal
    [Android] Gradle 安装
    [WPF] 动画Completed事件里获取执行该动画的UI对象
    Realm数据库的使用(二)数据库的添加、删除、修改、查询
    Realm数据库的使用(一)数据库的简单介绍和模型的创建
    进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图
    图解Disruptor框架(一):初识Ringbuffer
    图解Disruptor框架(二):核心概念
    常用排序算法的总结以及编码(Java实现)
    《Java并发编程实战》读书笔记一 -- 简介
  • 原文地址:https://www.cnblogs.com/wenwei-blog/p/7531798.html
Copyright © 2020-2023  润新知