暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python参数传递之方法间传递

工业解决方案 2021-09-22
416

Python传不可变对象(值类型)

    def changeInt(a):  # 定义方法:方法名和形参a
    print(id(a)) # 打印此时a的地址
    print(a) # 打印此时的a的值
    a = 10 # 方法内容 将传进来的值改为int类型的10
    print(id(a)) # 打印a的内存地址
    print(a) # 输出a的值


    b = 2
    print(id(b))
    changeInt(b)
    print(b)
    print(id(b))

    运行结果:

      140708726669616
      140708726669616
      2
      140708726669872
      10
      2
      140708726669616

      解释:该代码中有int类型的对象2,指向他的变量是b(地址),在b传递给changeInt()的时候,隐含了将实参a赋值给形参b的代码段,如:

        b=a

        那按照【点击上一节】文章来讲,不同变量指向相同对象,那么这两个对象的地址也一定相同,后续方法内首先打印了a的地址,a与b地址相同,那么地址相同了那值也应该相同吧?虽然至此我们都还没为a显式的赋值过,紧跟其后打印了a的值,确实如此,并没有对a进行初始化,但a却等于2,后来又对a赋值了10,那么如上节课的结论,对不可变对象重复赋值,新的赋值会导致地址一定会改变,直至方法结束,b从未参与,当然也不会发生改变。

        Python传可变对象(引用类型)

          def changeme(list):              # 定义方法:方法名和形参list
          print(id(list)) # 打印此时list的地址
          print(list) # 打印此时list的值
          list.append([1, 2, 3, 4]) # 方法内容 执行列表的实例方法
          print(id(list)) # 打印list的内存地址
          print("函数内取值: ", list) # 输出list的值


          mylist = [10, 20, 30]
          print(id(mylist))
          changeme(mylist)
          print("函数外取值: ", mylist)

          运行结果:

            2380872045064
            2380872045064
            [10, 20, 30]
            2380872045064
            函数内取值: [10, 20, 30, [1, 2, 3, 4]]
            函数外取值: [10, 20, 30, [1, 2, 3, 4]]

            解释:该代码中有list类型的对象[10,20,30],指向他的变量是mylist(地址),在mylist传递给changeme()的时候,隐含了将实参mylist赋值给形参list的代码段,如:

              list=mylist

              list与mylist地址相同,那么内存的内容也相同,后续list执行实例方法,如上一节文章所述,会在原有地址上修改,自然方法外的变量由于是相同引用,自然也就发生改变了。【点击上一节】

              这两篇文章仔细跟着思路走会有很大的收获,对于底层的了解也会更深一步。如果有不正确的地方恳请指正。

              文章转载自工业解决方案,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论