引用(二)
引用当做实参
- 可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
- 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]