zoukankan      html  css  js  c++  java
  • 局部变量与全局变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

    当去那句变量与局部变量同名时:

    在定义局部变量的子程序内,局部变量起作用;在其他地方全局变量起作用。

     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

  • 相关阅读:
    机器人学——1.6-双向量表示法
    机器人学——1.5-奇异点及万向节锁
    机器人学——1.4-三角度表示法
    机器人学——1.3-正交旋转矩阵
    MySQL数据库操作
    ArrayList和LinkedList的区别
    redis 常用命令
    idea快捷键
    Spring
    JDBC
  • 原文地址:https://www.cnblogs.com/hui147258/p/10850181.html
Copyright © 2011-2022 走看看