局部变量与全局变量
Posted hui147258
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了局部变量与全局变量相关的知识,希望对你有一定的参考价值。
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当去那句变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其他地方全局变量起作用。
1 name = ‘lhf‘ #全局变量 2 3 def change_name(): 4 print(‘我的名字‘,name) 5 6 change_name() 7 8 9 10 11 def change_name(): 12 name = ‘皮卡丘‘ #局部变量 13 print(‘我的名字‘,name) 14 15 change_name() 16 print(name) 17 18 19 20 def change_name(): 21 global name #声明全局变量 22 name = ‘皮卡丘‘ 23 print(‘我的名I‘,name) 24 25 change_name() 26 print(name) 27
如果函数的内容无global关键字:(优先读取局部变量,只能读取全局变量,无法对全局变量重新赋值) 1.有声明局部变量 NAME = [‘番茄’,‘百香果‘] def conghui(): name = ‘柠檬‘ print(‘我爱吃‘,NAME) conghui() 2.无声明局部变量 NAME = [‘番茄‘,‘百香果‘] def conghui(): NAME.append(‘柠檬‘) print(‘我爱吃‘,name) conghui() 如果函数的内容中有global关键字:(变量本质上就是全局变量,可读取可赋值) 1.有声明局部变量 NAME = [‘番茄‘,‘百香果‘] def conghui (): global NAME NAME=‘柠檬‘ print(‘我爱吃‘,NAME) conghui() 2.无声明局部变量 NAME = [‘番茄‘,‘百香果‘] def conghui (): global NAME NAME=[‘柠檬‘] NAME.append(‘柠檬‘) print(‘我爱吃‘,NAME) conghui()
#指定全局变量 name = ‘石头‘ def chunshe(): name = ‘春社‘ def beilei(): global name name = ‘蓓蕾‘ beilei() print(name) print(name) chunshe() print(name) #指定上一级变量 name = ‘石头‘ def chunshe(): name = ‘春社‘ def beilei(): nolocal name #nolocal name,指定上一级变量 name = ‘蓓蕾‘ beilei() print(name) print(name) chunshe() print(name)
嵌套函数和作用域
name = "Alex" def change_name(): name = "Alex2" def change_name2(): name = "Alex3" print("第3层打印",name) change_name2() #调用内层函数 print("第2层打印",name) change_name() print("最外层打印",name)
此时,在最外层调用change_name2()会出现什么效果?
没错, 出错了, 为什么呢?
作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变
例一: name=‘alex‘ def foo(): name=‘lhf‘ def bar(): print(name) return bar func=foo() func() 例二: name=‘alex‘ def foo(): name=‘lhf‘ def bar(): name=‘wupeiqi‘ def tt(): print(name) return tt return bar func=foo() func()()
递归调用
在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身
def calc(n): print(n) if int(n/2) ==0: return n res = calc(int(n/2)) return (res) calc(10
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
尾递归优化:http://egon09.blog.51cto.com/9161406/1842475
以上是关于局部变量与全局变量的主要内容,如果未能解决你的问题,请参考以下文章