从一段代码看pyhton中变量赋值机制

首先看如下代码:

a=10
def A(a):
    print('1.%d'%a)
    if a<5:
        print('2.%d'%a)
        return
    a=a-2
    print('3.%d'%a)
    A(a)
    print('4.%d'%a)
A(a)
print('5.%d'%a)

运行结果如下:

1.10
3.8
1.8
3.6
1.6
3.4
1.4
2.4
4.4
4.6
4.8
5.10

位置4的输出除了4以外还有6和8,位置5的输出并不是期望的4而是10,说明了两个问题:
1.运行过程中每一次变量赋值都开辟了一个新的地址用于存储变量的值,尽管变量名一样,但它们所指向的地址不同,所以才会在第4个打印变量a的命令处同时依次打印了4,6和8(因为函数的嵌套关系所以会出现这种打印顺序);
2.在函数内部定义(赋值)的变量作用域只限于函数内部,所以在5处打印出来的变量值为外部变量的值。
如果将上面代码中变量改成列表:

a=[10]
def A(a):
    print('1.%d'%a[0])
    if a[0]<5:
        print('2.%d'%a[0])
        return
    a[0]=a[0]-2
    print('3.%d'%a[0])
    A(a)
    print('4.%d'%a[0])
A(a)
print('5.%d'%a[0])

运行结果如下:

1.10
3.8
1.8
3.6
1.6
3.4
1.4
2.4
4.4
4.4
4.4
5.4

这时实际运行结果与期望结果是一致的。
当然,还可以通过声明全局变量的方式来解决这个问题,这时所有赋值操作都会指向全局变量的地址:

a=10
def A():
    global a
    print('1.%d'%a)
    if a<5:
        print('2.%d'%a)
        return
    a=a-2
    print('3.%d'%a)
    A()
    print('4.%d'%a)
A()
print('5.%d'%a)

运行结果:

1.10
3.8
1.8
3.6
1.6
3.4
1.4
2.4
4.4
4.4
4.4
5.4

猜你喜欢

转载自blog.csdn.net/weixin_43614688/article/details/88925636