局部变量与全局变量

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

以上是关于局部变量与全局变量的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript全局变量与局部变量

python基础局部变量全局变量

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

js全局变量与局部变量 预解析与作用域链详解

python函数中局部变量与全局变量遵守规则

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销