zoukankan      html  css  js  c++  java
  • 53.引用(二)

    引用(二)

    引用当做实参

    • 可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
    • Python有没有类似C语言中的指针传参呢?
    def test1(b):  # 变量b一定是一个局部变量,就看它指向的是谁?可变还是不可变
        b += b  # += 是直接对b指向的空间进行修改,而不是让b指向一个新的
        # b = b+b  # xx = xx+yyy 先把=号右边的结果计算出来,然后让b指向这个新的地方,不管原来b指向谁
                    # 现在b一定指向这个新的地方
    
    # a = [11, 22]
    a = 100
    test1(a)
    print(a)

    总结:

    • Python中函数参数是引用传递(注意不是值传递)
    • 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身
    • 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量
    # 定义了函数 而且函数有参数
    # 如果调用的函数有参数 我们传入的不是数据 而是引用
    # 分析的
    # 不可变的数据类型 (b += b & b = b + b)
    
    # b += b
    def func1(b ):
        print("内部开始:", id(b))
        b += b
        print("内部结束:", id(b))
    
    # 定义一个全局变量
    a = 10
    print("外部开始:", id(a))
    func1(a)
    print("外部结束:", id(a))

    运行结果:

    外部开始: 10911424
    内部开始: 10911424
    内部结束: 10911744
    外部结束: 10911424

    例子2:

    # b = b + b
    def func2(b):
        print("内部开始:", id(b))
        b = b + b
        print("内部结束:", id(b))
    
    
    # 定义一个全局变量
    a = 10
    print("外部开始:", id(a))
    func2(a)
    print("外部结束:", id(a))

    运行结果:

    外部开始: 10911424
    内部开始: 10911424
    内部结束: 10911744
    外部结束: 10911424

    结论:

    在不可变的数据类型中 无论b+=b还是b=b+b 都是等价的 都是进行重新赋值

    例子3:

    # 可变的数据类型 (b += b & b = b + b)
    # b += b
    def func3(b):
        print("内部开始:", b)
        # 对原来的保存引用的数据进行修改
        #  b+=b -> b.extend(b)
        b += b
        print("内部结束:", b)
    
    
    # 定义一个全局变量
    a = [1, 2]
    print("外部开始:", a)
    func3(a)
    print("外部结束:", a)

    运行结果:

    外部开始: [1, 2]
    内部开始: [1, 2]
    内部结束: [1, 2, 1, 2]
    外部结束: [1, 2, 1, 2]

    例子4:

    # b = b + b
    def func4(b):
        print("内部开始:", b)
        # 对形参b进行了重新赋值
        b = b + b
        print("内部结束:", b)
    
    # 定义一个全局变量
    a = [1, 2]
    print("外部开始:", a)
    func4(a)
    print("外部结束:", a)
    
    # b += b 对原来的数据进行修改 b = b + b 对形参b进行了重新赋值
    
    # 不可变的 无论是b+=b 还是b=b+b 都是重新赋值

    运行结果:

    外部开始: [1, 2]
    内部开始: [1, 2]
    内部结束: [1, 2, 1, 2]
    外部结束: [1, 2]
  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/kangwenju/p/12840195.html
Copyright © 2011-2022 走看看