这里,函数 func 的形参是 x,它只在函数内部有效,也就是作用域仅在函数中,如果在外部调用它,就会报错。变量 a 作为实参传递给函数 func,所以函数里 x 的值就是 a 的值,但 x 不是 a,只是现在它俩一样。变量 y 是函数中定义的局部变量,它的作用域同样也仅在函数中。对 x 进行赋值之后,x 的值发生了变化,但不会影响实参 a 的值。函数的返回值是 x 的值,并赋值给了外部的变量 b,所以 b 的值就是 x 的值,但 b 不是 x,此时 x 已不存在。
理解了上面几条之后,我们再修改一下函数:
def func(x):
print('x =', x)
x = 10
x += x
print('x =', x)
return x
x = 5
func(x)
print('x =', x)
复制代码
输出:
x = 5
x = 20
x = 5
复制代码
解读一下:函数 func 的形参是 x。外部变量 x 作为实参传递给函数 func,所以函数里 x 的值就是外部 x 的值,但这两个 x 是两个不同的变量,只是现在值一样。变量 x 在函数中被重新赋值 10,但不会影响外部变量 x 的值。对 x 自身做了累加,此时 x 变成 20。函数的返回值是 x 的值,但没有赋值给任何变量,所以此返回值没任何作用,函数结束。外部的变量 x 仍然是一开始的值 5。但在初学阶段,不建议你这么给变量命名,可能会把自己绕进去。把代码写清楚,多定义几个变量,多分几行代码,反正也不要钱。(除非你是做区块链程序开发)
那如果要在函数内部修改外部的变量可不可以呢?
可以,用全局变量。
def func():
global x
x = 10
x = 5
func()
print('x =', x)
复制代码
输出:
x = 10
复制代码
在函数中声明 global x,程序就会知道这个 x 是一个全局变量。此时的 x 就是外部的 x,给它赋值的结果自然在函数结束后依然有效。但这种情况下,你不能再同时将 x 设定为函数的形参。