作用域与带有循环变量的默认参数相比较问题

这个问题是来自于美国作家鲁特兹(Mark Lutz)所作的一本《Learning Python,Fourth Edition》书里提及到的。

原文如下:

如果 lambda 或者 def 在函数中定义,嵌套在一个循环之中,并且嵌套的函数引用了一个上层作用域的变量,该变量被循环变量所改变,所有在这个循环变量中产生的函数将会有相同的值——在最后一次循环中完成时被引用变量的值。

我们来看下一个例子:

>>> def makeActions():
...     acts = []
...     for i in range(5):
...             acts.append(lambda x: i ** x)
...     return acts
...
>>> acts = makeActions()
>>> acts[0](2)
16
>>> acts[1](2)
16
>>> acts[2](2)
16
>>> acts[3](2)
16
>>> acts[4](2)
16

另一个例子:

>>> def makeActions():
...     acts = []
...     for i in range(5):
...             acts.append(lambda x, i = i: i ** x)
...     return acts
...
>>> acts = makeActions()
>>> acts[0](2)
0
>>> acts[1](2)
1
>>> acts[2](2)
4
>>> acts[3](2)
9
>>> acts[4](2)
16

具体还待考究

原文地址:https://www.cnblogs.com/importthis/p/8975690.html

时间: 2024-11-10 14:04:49

作用域与带有循环变量的默认参数相比较问题的相关文章

for循环变量声明为 final

防止在循环体里修改循环变量 在默认情况下,编译器是允许在第二种for循环的循环体里,对循环变量重新赋值的.不过,因为这种做法对循环体外面的情况丝毫没有影响,又容易造成理解代码时的困难,所以一般并不推荐使用. Java提供了一种机制,可以在编译期间就把这样的操作封杀.具体的方法,是在循环变量类型前面加上一个“final”修饰符.这样一来,在循环体 里对循环变量进行赋值,就会导致一个编译错误.借助这一机制,就可以有效的杜绝有意或无意的进行“在循环体里修改循环变量”的操作了. for (final M

函数声明和函数定义中的默认参数浅析

默认参数是存在于函数的声明中,还是函数的定义中呢? 我在VS6.0和VS2008下做了如下实验,并做出了简单的总结,有不足或者不准确的地方,欢迎大家拍砖,我会及时修正相关内容. 实验一:默认参数不能同时存在于函数声明和函数定义中. #include <iostream> #include <tchar.h> using namespace std; void SetHeight(double dHeight = 183.5); int _tmain(int argc, TCHAR*

C++函数默认参数(转)

在代码中使用到了函数的默认参数,在函数的定义和实现中都填写的默认参数,结果出现了错误: 代码: 1 #ifndef FIRSTPAGE_H 2 #define FIRSTPAGE_H 3 4 #include <QWizardPage> 5 #include "ui_firstdialog.h" 6 7 class FirstPage : public Ui::FirstDialog, public QWizardPage 8 { 9 public: 10 FirstPag

移植u-boot-2015.10到JZ2440开发板(五)——设置nand分区,环境变量保存地址和其它默认参数

在下载内核或文件系统时,我们可以直接在命令中写明烧到nandflash的具体地址,但较麻烦,我们可以给nandflash分区,这样就可直接写烧到那个分区就行了,较为方便.如何设置呢?首先我们在uboot中输入mtdparts命令,看看默认的分区,结果提示mtdids not defined, no default present.搜索"mtdids not defined",定位到common/cmd_mtdparts.c的mtdparts_init函数中,分析发现是mtdids_de

java循环练习:由输入的值决定循环的执行次数,循环变量默认从1开始

package practiceGO; import java.util.Scanner; /*   3.由输入的值决定循环的执行次数,循环变量默认从1开始  */ public class Cto { public static void main(String[] args) { Scanner sc = new Scanner(System .in); System.out.println("请输入循环次数:"); int time = sc.nextInt(); for(int

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

iReport默认参数和变量的含义解析【转】

iReport默认参数和变量的含义解析[转] http://uule.iteye.com/blog/775338 参考:http://blog.csdn.net/terryzero/article/details/4005858 $V{PAGE_NUMBER} 代表当前页数(可以是页码也可以是页数,通过TextField的计算时间的不同值来设置) $V{PAGE_COUNT} 当前页面中记录的数目 对于$V{PAGE_NUMBER}:当evaluationTime="Now"时,即是计

函数传参时,默认参数为变量容易出现的问题

在定义函数时使用默认参数的时候,如果默认参数是变量的话,需要注意一下坑. 1 # This Python file uses the following encoding: utf-8 2 3 def add_end(l = []): 4 l.append('end') 5 print(id(l), l) 6 7 if __name__ == '__main__': 8 add_end() 9 add_end() 10 11 输出: 12 2510338155080 ['end'] 13 251

day46homework常量字符串拼接结构赋值扩展运算符for-of循环map函数默认值

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01定义常量.html</title> <!--常量--> <script> //常量:1.一旦定义 不能更改 const PI = 3.14;  // console.log(PI); // PI = 3.1415; error