Python变量的作用域,python类中的全局变量
我们先来看代码。问题不是很多吗?
defscope_test(:defdo_local)):
垃圾邮件=本地垃圾邮件
defdo_nonlocal():
非本地垃圾邮件
spam=非本地spam
defdo_global () :globalspam
spam= global spam spam= test spam do _ local()print)、afterlocalassignment:)、spam)).
do_nonlocal () print)、afternonlocalassignment:)、spam)。
do_global () print)、afterglobalassignment:)、spam)。
scope_test () print)、 inglobalscope:、spam)和的输出:
自适应3360测试间隔
afternonlocalassignment 3360非本地垃圾邮件
Erglobalisation 3360非局部空间
全局空间:全局空间
当你不知道第三个原因时,加上
x=0defouter():
x=1
定义者(:globalx
x=2
print(inner:x))))))))))))))).
内部()打印)、外部: )、x).
outer () print(global:,x ) inner :2 # outer :1 # global:
如果局部变量与全局变量同名,则首先调用局部变量,从而解决上述问题。
首先,了解全局变量和局部变量。
1.全局变量和局部变量的区别在于范围。全局变量在整个py文件中声明,可以全局使用;局部变量是在函数内部声明的,并且只能在函数内部使用。当超出使用范围(函数外)时,就会出错。
A=100 #全局变量通常用大写字母表示。
deffunc(:
A=50 #局部变量通常用小写字母表示。
打印(aa))。
func () #150
打印(一)#100
Print(a) #错误消息名称错误:名称“a”未定义,表明局部变量只能在函数中使用
2.在函数内部,如果局部变量与全局变量同名,将首先调用局部变量。
A=100
deffunc(:
A=250
打印(a)打印(a) #打印所有变量100
Func(#局部变量250
3.如果要改变函数内部的全局变量,必须在它前面加上global关键字。函数执行后,全局变量的值也会改变。
A=100
deffunc(:globala
A=200
打印(a)打印(a) #打印全局变量100
Func(#局部变量200
Print(a) # changed全局变量200
4.如果全局变量是列表类型(如果全局变量是可变对象,可以处理内部元素),可以使用list的list方法修改列表,而不是使用global进行声明。
list _1=[ 1,2,56, list]defchangeList():
list_1。append ("over"(print ) list _1))))))))).
changelist (# [ 1,2,56, list , over])
print(list_1) # [ 1,2,56, list , over]
5.如果函数中有一个全局关键字,那么这个变量本质上就是一个全局变量,是可读的,可赋值的。
NAME=尼古拉斯
print(1,NAME)def change _ NAME)):global NAME
NAME=牛逼
打印(更改名称,名称).
Change_NAME () print(2),NAME) # has global,定义了一个全局变量,可以赋值也可以修改。
请注意全球立场。如果global需要改变全局变量,这里的global不能位于name=nick 下
6.如果全局变量是不可变对象(不是列表),就不能在函数中修改,但是如果要修改,可以使用全局变量。
count=0defglobal_test():
计数=1
打印(计数)
global _ test()# unboundlocalrerror:在赋值前引用了局部变量“count”
非局部的
Python变量引用顺序:从当前作用域开始查找变量,如果找不到,则转到上一个作用域,如果找不到,则转到下一级。
即当前作用域的局部变量-外作用域变量-外作用域变量-当前模块的全局变量-pyhton内置变量。
全局:全局变量
非局部:外部嵌套函数的变量
使用摘要:
1.global用于在局部范围内改变全局变量。Global也可以定义新的全局变量。
2.内函数用非局部变量改变外函数。非局部不能定义新的外部函数变量,只能改变已有的外部函数变量(全局作用域的上一级没有外层,会报错)。同时,非局部不能改变全局变量。
没有非局部
A=当前模块的10 #a1全局变量
defouter():
A=9 #a2当前外部作用域的局部变量
定义者():
A=8 #a3当前内部作用域的局部变量
Print(a) #a3 8,a3在内部的局部范围内被发现
inner() #inner()函数结束,a3作为内部局部变量被释放。
Print(a) #a2 9,在外部局部范围中查找a2
outer() #outer()函数结束,a2作为外部局部变量被释放。
一个 8
九
10
用于在内部函数中改变外部函数的变量
A=当前模块的10 #a1全局变量
defouter():
A=9 #a2外部局部变量
定义者():
非局部的
A=8 #a3既是内部局部变量又是外部局部变量。
Print(a) #a3 8,a3在内部的局部范围内被发现
inner() #inner()函数结束,a3作为外部变量(外部局部变量)保留为a2
Print(a) #a2 8,在外部局部范围内查找a2(在内部已更改)
outer() #outer()函数结束,a2作为外部局部变量被释放。
Print(a) #a1 10,在当前模块的全局范围内发现a1
输出
八
八
10
如果在外层没有找到变量A,它将继续在外层搜索,直到全局范围的下一层。
A=当前模块的10 #a1全局变量
defouter2():
A=9 #a2外部2范围局部变量
打印(a) #a2 9,未被a3更改
Defouter1():print(a) #a2 9,如果在outer1中没有找到局部变量A,那么就寻找外部变量a2(没有被a3改变)
定义者():
非局部的
A=0 #a3既是内部局部变量,也是外部2范围变量。
Print(a) #a3 0,找到内部局部变量a3
inner() #inner()函数结束,a3保留为a2作为外部变量(outer2局部变量)
Print(a) #a2 0,如果在outer1中没有找到局部变量A,就会找到外部变量a2(被a3改变)。
Outer1()print(a) #a2 0,在Outer1中找到outer1的局部变量a2(被a3改变)
Outer2()print(a) #a1 10,在当前模块的全局范围内发现a1。
输出
九
九
0
0
0
10
全局变量不是外部变量,也不会被非局部搜索。
A=当前模块的10 #a1全局变量
de fouter():definer():
非局部a#在当前作用域的外局部作用域,即外局部作用域中没有找到外局部变量A。外部范围是全局范围。非本地不继续找,报错。
a=8
打印(一份)
内部()打印(a)
Outer()print(a) #a1 10,在当前模块的全局范围内发现a1
输出
语法错误:未找到非本地“a”的绑定“”
注意:用global关键字修饰的变量以前可能不存在,而用非local关键字修饰的变量必须已经存在于嵌套的作用域中。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。