#! /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_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
原文地址:https://www.cnblogs.com/leonraw/p/9040366.html
时间: 2024-11-10 01:36:04