zoukankan      html  css  js  c++  java
  • python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变

    函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b。那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变


    首先解释一下,什么是python对象的内容可变不可变?

    python的变量是无类型的,如n=1   #变量n无类型(n相当于指针),其指向int数据类型的值,这个值是int类型。

    所以,python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。

           举个列子,

        不可变如,a=5后,a=10,这里实际是新生成一个int值对象10,再让a指向它,而5被丢弃,不是改变a的值,相当于新生成了a。

            而可变如,la=[1,2,3,4]后,la[2]=5则是将list la的第二个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

    那么,python函数的参数传递:

            可变类型,则类似c++的引用,如list、dict。如fun(la),则是将la真正的传过去,修改后fun外部的la也会受影响

            而不可变类型,则类似c++的值传递,如int。如fun(a),传递的只是a的值,没有影响a对象本身。比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。

    讲的很细:http://blog.csdn.net/winterttr/article/details/2590741


    同样的道理,python变量复制也是一样,a=b:

    变量间复制,可变对象是引用,不可变是值copy(新生成值空间,不是变量对象空间)

          

    样例代码如下:

             a={1:'a',2:'b',3:'c'}
             b=a
             a[4]='d'
             print a,b

    #输出:{1: 'a', 2: 'b', 3: 'c', 4: 'd'} {1: 'a', 2: 'b', 3: 'c', 4: 'd'}


            a=10
            b=a
            a=6
            print a,b

    #输出: 6 10

  • 相关阅读:
    EasyBPM进销存之物料管理
    水厂流程三维场景可视化解决方案
    构造器
    可变形参
    重写
    拥塞处理(一)——拥塞处理的历史概述
    idea的各种乱码问题
    MySQL的主键也想使用uuid
    使用spring security明文密码校验时报错-BadCredentialsException: Bad credentials
    ValueError: check_hostname requires server_hostname
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205593.html
Copyright © 2011-2022 走看看