python中局部变量与全局变量的作用域

局部变量:在某个函数内部定义,作用在函数内部。生命周期:从变量被创建开始到函数结束死亡。
全局变量:定义在.py模块内部,作用在整个.py模块。生命周期:从变量被创造开始到.py模块结束死亡。
下面用案例具体来说明它的作用域:
(1):

def Demo1():
    num = 1
    print(num)

Demo1()
print(num)
	
"""
因为num是局部作用,所以在函数外面是找不到num这个变量的,
所以程序会报错:NameError: name 'num' is not defined
"""

(2)

num = 0

def Demo1():
    num = 1
    print("在demo1中的结果:",num)

def Demo2():

    print("在demo2中的结果:",num)

Demo1()
Demo2()

print("在函数外面中的结果:",num)
"""
运行结果为:
在demo1中的结果: 1
在demo2中的结果: 0
在函数外面中的结果: 0
分析:
从结果可以看出,我们在demo1中num = 1,只在demo1内部起作用,而全局变量num仍然是0;因为在python中,在函数内部改变全局变量的值,会默认的在函数内部创建一个新的变量,全局变量并没有改变。要想要改变全局变量的值,需要在函数内部用global声明。

"""
#修改上面如下
num = 0

def Demo1():
    global num
    num = 1
    print("在demo1中的结果:",num)

def Demo2():

    print("在demo2中的结果:",num)

Demo1()
Demo2()

print("在函数外面中的结果:",num)
""'
运行结果为:
在demo1中的结果: 1
在demo2中的结果: 1
在函数外面中的结果: 1
"""

(3)还有一种情况是当全局变量是可变数据类形,我们可以通过修改可变数据类型的方法,修改可变类型的内容,从而实现修改全局变量。(这里因为可变数据类型改变时,会在内存中改变数据的值)

num_list = [1,2,3]

def Demo1(demo1_list):
    demo1_list.append(4)
    print("在demo1中的结果:",demo1_list)

def Demo2():

    print("在demo2中的结果:",num_list)

Demo1(num_list)
Demo2()

print("在函数外面中的结果:",num_list)
	

	

"""
运行结果:
在demo1中的结果: [1, 2, 3, 4]
在demo2中的结果: [1, 2, 3, 4]
在函数外面中的结果: [1, 2, 3, 4]
"""

(4)列表 += 与 + 的区别

+
num_list = [1,2,3]

def Demo1(demo1_list):
    demo1_list = demo1_list + [4,5,6]
    print("在demo1中的结果:",demo1_list)

def Demo2():

    print("在demo2中的结果:",num_list)

Demo1(num_list)
Demo2()

print("在函数外面中的结果:",num_list)
执行结果:
在demo1中的结果: [1, 2, 3, 4, 5, 6]
在demo2中的结果: [1, 2, 3]
在函数外面中的结果: [1, 2, 3]


+=:
num_list = [1,2,3]

def Demo1(demo1_list):
    demo1_list +=  [4,5,6]
    print("在demo1中的结果:",demo1_list)

def Demo2():

    print("在demo2中的结果:",num_list)

Demo1(num_list)
Demo2()

print("在函数外面中的结果:",num_list)
结果:
在demo1中的结果: [1, 2, 3, 4, 5, 6]
在demo2中的结果: [1, 2, 3, 4, 5, 6]
在函数外面中的结果: [1, 2, 3, 4, 5, 6]

因为:
对于+号操作,可变对象和不可变对象调用的都是__add__操作

对于+=号操作,可变对象调用__add__,不可变对象调用的是__iadd__(不可变对象没有__iadd__) __iadd__是原地修改

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值