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]

 

posted @ 2020-05-07 00:55  kelin1  阅读(98)  评论(0编辑  收藏  举报