zoukankan      html  css  js  c++  java
  • python 12

    #! /usr/bin/python
    
    a = 1
    b = [2, 3]
    
    
    def func():
        a = 2
        print("in func a:", a)
        b[0] = 1
        print("in func b:", b)
    
    
    print("before func a:", a)
    print("before func b:", b)
    func()
    print("after func a:", a)
    print("after func b:", b)
    before func a: 1
    before func b: [2, 3]
    in func a: 2
    in func b: [1, 3]
    after func a: 1
    after func b: [1, 3]

     

    def func():
        if a == 1:
            a = 2
            print("in func a:", a)
            b[0] = 1
            print("in func b:", b)
    
    # UnboundLocalError: local variable 'a' referenced before assignment

    网络解释:

    可以看出,对于变量a,在函数func中"a = 2",因为存在既可以表示引用全局变量a,也可以表示创建一个新的局部变量的歧义,所以python默认指定创建一个新的局部变量来消除这一歧义,但对于列表b而言,"b[0] = 1"不存在这种歧义,因此直接修改了全局变量,但是如果改成了"b = [3, 4]",那么b也会变成局部变量。特别地,当在func中a = 2之前加入"if a == 1:"这一语句,脚本运行出错,因为这一语句引入了全局变量,导致了"a = 1"这一语句无法创建同名的局部变量。

    自己理解:

    若在func中a = 2之前加入"if a == 1:"这一语句,脚本运行出错,报“UnboundLocalError: local variable 'a' referenced before assignment”错误,“在创建局部变量 'a' 之前(a = 2),引用了局部变量 'a' (a == 1)”。故,若计算机发现在函数局部已经创建了命名空间,则进行引用变量时,会被认为引用的是局部变量。

    ****************************************************************

    零、默认参数为可变元素时的处理

    def func(a, lis=[]):
        lis.append(a)
        return lis
    
    
    lis1 = func(10)
    lis1.append('a')
    lis2 = func('b')
    print(lis2)
    [10, 'a', 'b']
    
    

    可看出,Pass

    一、带参数的装饰器

    def func_out(turn):
        def func(f):
            def inner(*args, **kwargs):
                if turn:
                    print('before')
                    ret = f(*args, **kwargs)
                    print('after')
                else:
                    ret = f(*args, **kwargs)
                return ret
            return inner
        return func
    
    
    @func_out(True)
    def good(a, b):
        print(a, b, 'this func is pretty good')
    
    
    good(1, 2)

    作用:可以传入一个变量,控制函数内部的东西~

    二、俄罗斯套娃(多个装饰器)

    def func_1(f):
        def inner_1(*args, **kwargs):
            print('before_1')
            ret = f(*args, **kwargs)
            print('after_1')
            return ret
        return inner_1
    
    
    def func_2(f):
        def inner_2(*args, **kwargs):
            print('before_2')
            ret = f(*args, **kwargs)
            print('after_2')
            return ret
        return inner_2
    
    
    @func_2
    @func_1
    def good(a, b):
        print(a, b, 'this func is pretty good')
    
    
    good(1, 2)
    before_2
    before_1
    1 2 this func is pretty good
    after_1
    after_2
  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/leonraw/p/9040366.html
Copyright © 2011-2022 走看看