python开发应用程序错误_Python 程序员经常犯的 10 个错误

常见错误 #6: 不明白Python在闭包中是如何绑定变量的

看下面这个例子:

>>> def create_multipliers():

... return [lambda x : i * x for i in range(5)]

>>> for multiplier in create_multipliers():

... print multiplier(2)

...

你也许希望获得下面的输出结果:

0

2

4

6

8

但实际的结果却是:

8

8

8

8

8

惊讶吧!

这之所以会发生是由于Python中的“后期绑定”行为——闭包中用到的变量只有在函数被调用的时候才会被赋值。所以,在上面的代码中,任何时候,当返回的函数被调用时,Python会在该函数被调用时的作用域中查找 i 对应的值(这时,循环已经结束,所以 i 被赋上了最终的值——4)。

解决的方法有一点hack的味道:

>>> def create_multipliers():

... return [lambda x, i=i : i * x for i in range(5)]

...

>>> for multiplier in create_multipliers():

... print multiplier(2)

...

0

2

4

6

8

在这里,我们利用了默认参数来生成一个匿名的函数以便实现我们想要的结果。有人说这个方法很巧妙,有人说它难以理解,还有人讨厌这种做法。但是,如果你是一个 Python 开发者,理解这种行为很重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python字典和集合)

字典和集合 字典 每个字典元素都是一个键(关键字)/值(关键字对应的取值)对 #创建字典 dic_score{"语文":80,"数学":99} #打印 print(dic_score) print(dic_score["语文"]) #长度 print(dic_score.__len__)#错误写法 print(len(dic_score)) #…

VxWorks动态加载.out文件

//Device.cpp #include "other.h" #ifdef __cplusplus extern "C" { #endif int initDevice(char *arg); #ifdef __cplusplus } #endif int initDevice(char *arg) { printf("%s\n", arg); } 生成的.out文件需对其使用如下命令 chmod.exe arx…

[Project Euler]加入欧拉 Problem 9

A Pythagorean triplet is a set of three natural numbers, a b c, for which, a2 b2 c2 For example, 32 42 9 16 25 52. There exists exactly one Pythagorean triplet for which a b c 1000.Find the product abc. 意思很明白找出这样的a, b, c abc 1000 a …

java 在已有的so基础上封装jni_[干货]再见,Android JNI 封装

1 前言2 JNI 速查表2.1 Java 和 Native 数据类型映射表2.2 引用类型3 JNI 理论基础速览4 JNI 常用场景示例4.1 字符串传递(java->native)4.2 字符串返回(native->java)4.3 数组传递(java->native)4.4 其他复杂对象传递(java->native)4.5 复杂对象返回(native->j…

神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python函数)

函数(function) :实现某种特定功能的代码块 优点:程序简洁,可重复调用、封装性好、便于共享 类别:系统函数和用户自定义函数 Python内置函数 数学运算函数 print(abs(-1)) print(pow(2,3)) print(round(3.1415926,…

arm B和BL指令浅析

B或BL指令引起处理器转移到“子程序名”处开始执行。两者的不同之处在于BL指令在转移到子 程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。由于BL指令保存了下条指令的地 址,因此使用指令“MOV PC ,LR”即可实现子…

神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python模块、包和库)

模块(Module) 模块是一个python文件(.py),拥有多个功能相近的函数或类。 便于代码复用,提高编程效率,提高了代码的可维护性。 避免函数名和变量名冲突。 包(Package)…

ARM uboot中的.lds

对于.lds文件,它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。虽然现在我还没怎么用它,但感觉还是挺重要的,有必要了解一下。先看一下GNU官方网站上对.lds文件形式的完整描述:SECTIONS …

原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)

淡入淡出效果,在日常项目中经常用到,可惜原生JS没有类似的方法,而有时小的页面并不值得引入一个jQuery库,所以就自己写了一个,已封装, 有用得着的朋友, 可以直接使用. 代码中另附有一个设置元素透明度的方法, 是按IE规则(0~100)设置, 若改成标准设置方法(0.00~1.00), 下面使用时…

神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(Python面向对象的编程)

面向对象的程序设计(OOP) 对象(object): 将属性和方 法封装在一起。 类(class): 具有相同的属性和方法的对象集合。 对象是类的实例 子类继承了父类的全部属性和方法, 并且也有自己特有的属…

python实验四_python实验四

1.简单计算器的设计 请设计简单的“加减乘除”计算器并从键盘上输入数据进行计算 def add(x, y): """相加""" return x y def subtract(x, y): """相减""" return x - y def multiply(x, y): """…

adr和ldr的区别

其实这两个都是伪指令:adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令。可实际上adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立即数或一个地址到指定的寄存器中。到这儿就会看到其中的区…

收藏:flex/flash

关于Flash Professional CS5的代码提示不显示的几种解决办法一个flash组件开发网站(不过大部分是收费的) Ruochi.com -- Ruochi Group - flash.actionscript.gadgets(图片轮换播放 开源项目)Flash获取html参数的方法AS3 库资源 很多非常有用的类库 转载于…

python3.8怎么打开创建_Python 3.8 新功能大揭秘【新手必学】

最新版本的Python发布了!今年夏天,Python 3.8发布beta版本,在2019年10月14日,第一个正式版本已准备就绪。现在,我们都可以开始使用新功能并从最新改进中受益。 Python 3.8是Python语言的最新版本,它适合用于…

神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python文件)

路径 绝对路径:从盘符开始的路径 相对路径:从当前目录(工作目录)的路径 获取当前路径 #获取当前工作目录 import os print(os.getcwd())访问模式 文件对象open(文件名,访问模式) f open…

ldr

首先要判断我们用的是ldr arm指令还是伪指令。 当我们用的是arm指令时,它的作用不是向寄存器里加载立即数,而是将某个地址里的内容加载到寄存器。而伪指令ldr的作用就是向寄存器里加载立即数。 (1) ldr伪指令ldr伪指令的格式是 ld…

神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python异常处理)

异常: 程序运行时的错误,对应一个Python对象。 try: 语句块 except 异常1 as 错误原因: 出现异常1后的处理代码 except 异常2 as 错误原因: 出现异常2后的处理代码 #在程序运行时,解释器尝试执行try语句块中的所有代码。 try:alist [0,…

linux串口编程实例_Linux 网络编程——原始套接字实例:发送 UDP 数据包

以太网报文格式:IP 报文格式:UDP 报文格式:校验和函数:/*******************************************************功能:校验和函数参数:buf: 需要校验数据的首地址nword: 需要校验数据长度的一半返回值&am…

2011

2011年给力的一年转载于:https://www.cnblogs.com/njgperfect/archive/2011/02/04/1949158.html

python2安装_如何安装python2

目前市面上python的主流版本有两个,一是python2.X的版本,另有一种是python3.X的版本。python2预计在2020年将停止维护,未来python3将是主流。 下面讲一下python2.x的安装详细讲解。Python安装: 本文以python 2.7.8(64位)为例说明&…