#! /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()
lis1.append('a')
lis2 = func('b')
print(lis2)
[, '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

python 12的更多相关文章

  1. python 12 模块与包

    一.不知道什么原则 python文件下面只写方法,所有的可直接执行的代码,都放在条件下 原因.该文件有可能被其他文件调用 二.eval() 将字符串转为相应的数据格式可以想象json转为map 三.模 ...

  2. Python 12 - Mysql & ORM

    本节内容 1.数据库介绍 2.mysql数据库安装使用 3.mysql数据库基础 4.mysql命令 5.事务 6.索引 7.Python操作mysql 8.ORM sqlalchemy了解 数据库介 ...

  3. [ Python - 12 ] 线程的信号量、标志位及队列

    线程的信号量 线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发. #!_*_coding:utf-8_*_ # Author: hkey import threading, t ...

  4. python 12 生成器

    目录 1. 生成器 yeild 2. 推导式 2.1 列表推导式: 2.2 生成器推导式: 2.3 字典推导式: 2.4 集合推导式: 3. 内置函数(一) 1. 生成器 yeild 生成器的本质就是 ...

  5. 《转》python 12 列表解析

    转自 http://www.cnblogs.com/BeginMan/p/3164937.html 一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter ...

  6. Python——12类的继承

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. python <12> socket 编程

    1.socket编程需要两个部分 服务器与客户端我们的python中调用 socket包就不需要自己写协议了(socket编程中windows 与Linux中的效果是完全不相同了,次代码最好是放在Li ...

  8. 【Python 12】汇率兑换5.0(Lambda函数)

     1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4. ...

  9. python ---12 生成器 推导式

    一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数   2. ...

随机推荐

  1. 跟随我在oracle学习php(19)

    Order by子句 形式: order  by  排序字段1  [排序方式],  排序字段2  [排序方式], ..... 说明: 对前面取得的数据(含from子句,where子句,group子句, ...

  2. v模拟器(华为、H3C)点滴

    华为模拟器:eNSP V100R002C00B500 安装问题: 1)环境为WIN10,64位专业版 2)安装完成后可以打开界面,但是新建一个设备后,打不开,一直不停的#号 3)解决:手工点击Virt ...

  3. SpringBoot项目搭建与打包

    一.环境准备 本地java环境jdk1.8 Maven版本3.5.2 IDE工具idea2017 二.SpringBoot微服务搭建 1.点击File >> New >> Pr ...

  4. rnn应用

    Weather Recognition plays an important role in our daily lives and many computer vision applications ...

  5. R语言实战基本方法

    R语言的主要功能包括数据统计分析方法和数据可视化,数据分析在这一章中主要学习创建基本图形和基本数据分析 一 基本图形 1条形图 barplot(height)  //添加一个条形图,height是一个 ...

  6. Spring 基础知识(二)Spring的bean初始化与生命周期,以及注入

    Spring bean 初始化: 参考博文: https://www.cnblogs.com/luyanliang/p/5567164.html 1. 加载xml 文件. 扫描注解 ,形成bean定义 ...

  7. position:fixed 兼容浏览器低版本

    项目中遇到的坑,写篇博客做个笔记纪念下,position: fixed一般来说都兼容各个浏览器,但是要兼容浏览低版本问题,就得用-webkit-transform: translateZ(0);这段代 ...

  8. Mantis:Mantis rest api url 404 Not Found.解决过程纪录

    测试Mantis rest api时碰到的问题:404 Not Found. 根据文件,Mantis rest api的预设url是{{url}}/api/rest/{{controller}}. 其 ...

  9. Oracle常用sql命令

    1.查看数据库归档是开启还是关闭SQL> archive log list 更改数据库归档模式: SQL> shutdown immediateSQL> startup mountS ...

  10. Oracle数据库各种名字的区别

    数据库名(DB_NAME).数据库实例名(INSTANCE_NAME).操作系统环境变量(ORACLE_SID).数据库服务名(SERVICE_NAME).数据库域名(DB_DOMAIN)以及全局数据 ...