精华内容
下载资源
问答
  • kettle设置循环变量

    2018-10-16 11:18:42
    kettle设置循环变量,控制循环作业;kettle设置循环变量,控制循环作业.
  • bat批处理循环变量

    2014-07-03 22:47:48
    bat 批处理的加法,想实现,i=1~5的5次循环里,j的值为2~6
  • 文章目录python3中 for 循环中循环变量的作用域问题1-1 来看一个例子1-2 来看第二个例子1-3 循环变量 覆盖 外层变量的问题2 python 变量的作用域的问题2-1 来看一个 全局变量的例子2-2 如何修改一个全局变量呢2-3 在...

    python3中 for 循环中循环变量的作用域问题

    前段时间 对实际项目重构代码,然后在我给变量重新命名的时候,
    for 循环中循环变量名 和外层 的变量名,取名相同,结果直接覆盖了外层变量的值, 由此 我就查了一下 文档有了这篇文章。

    1-1 来看一个例子

    编写 hello.py

    
    for num in [1, 5, 10]:
        print(num,end=' ')
    
    print(f"=== after for:{num}")
    

    结果输出
    1 5 10 === after for:10

    num 这个变量 在 for 循环代码块 结束后,仍然有效。

    也就是说在 for 循环 迭代 一个可迭代对象的时候,离开for 循环的代码段,这个 循环变量num 依然有效 。

    1-2 来看第二个例子

    如果迭代是 对象没有值的话,num 就不会赋值 这个时候,for 循环 就不能进入,此时num 也没有赋值,即没有num 这个变量.

    
    for num in []:
        print(num,end=' ')
    
    print(f"=== after for:{num}")
    
    

    结果如下:

    img-01

    1-3 循环变量 覆盖 外层变量的问题

    如果我在 模块级别定义一个num 的变量,然后 for 循环的索引变量 也是num 并且 迭代对象 不为空的时候, 这个时候 就有可能出现 问题,

    因为此时 for 循环的 索引变量 num 会覆盖外层的变量, 使外层变量的值发生改变。

    
    num =100
    
    for num in [1,2,3]:
        print(num,end=' ')
    
    print(f"=== after for:{num}")
    
    

    结果如下:
    1 2 3 === after for:3

    从结果可以看出 num 的值是3 ,说明 经过 for 循环后 ,num 最后赋值为3, 和 上面 num =100 有冲突,直接 把 num 的值 覆盖了。
    这是因为 外层num 和 for 循环里面的 num 是处于一个作用域, 都是模块级别的变量。 所以都在模块级别的变量,不能重复。

    那么如何避免这种问题呢?

    方法一:
    修改 循环变量的名称,不要和外层变量名一样,这样两个变量名称,就不会冲突了。

    方法二 :
    可以把for 循环里面的内容 封装成一个函数,这样就可以 避免变量名 覆盖的问题。

    # -*- coding: utf-8 -*- 
    
    num = 100
    
    
    def print_num():
        for num in [1, 2, 3]:
            print(num, end=' ')
        print()
    
    
    if __name__ == '__main__':
        print_num()
        print(f"=== after print_num:{num}")
        pass
    
    

    结果如下:
    img-02

    从结果可以看出, num 没有被污染, 这两个 num 在不同的作用域里面。
    这样python 解释器 就不会覆盖。

    2 python 变量的作用域的问题

    正好来一起来探讨 变量作用域的问题 ,
    作用域 就是指 一个变量的作用范围在哪里。 一个变量的作用范围 或者说 在哪一代码段 是有效的。

    在python中

    全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。

    全局名称 就是 一般定义在模块级别的变量。

    局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

    局部 是指 定义在函数 或者类中的一些变量。

    2-1 来看一个 全局变量的例子

    # -*- coding: utf-8 -*-
    
    # 全局变量
    num = 100
    
    
    
    print(f"module num:{num}")
    
    
    def visit_num():
        print(f"visit num:{num}")
    
    
    
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
        pass
    

    由于num 定义在 模块级别 是一个全局变量,此时 num 之后的所有代码 都可以访问到这个变量的。 这就是全局变量

    2-2 如何修改一个全局变量呢

    你可能 直接感觉 visit_num 函数里面修改这个变量不就可以了吗,

    如下面的代码段

    # -*- coding: utf-8 -*-
    
    
    num = 10000000
    
    print(f"module num:{num}")
    
    
    def visit_num():
        print(f"visit num:{num}")
        num = 0
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
    

    运行代码发现会报错

    img-05

    原因是 解释器无法知道 num=0 是想在 visit_num() 这个函数定义一个变量叫num,还是想修改 上面定义的全局变量,所以 就报错了。

    那么如何让 解释理解 num 是要修改 全局变量呢?

    # -*- coding: utf-8 -*-
    
    num = 10000000
    
    print(f"module num:{num}")
    
    
    def visit_num():
        # 这里使用关键字进行声明
        global num
        print(f"visit num:{num}")
        # modify num
        num = 0
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
    
    

    这样就可以正常 的修改 num 的值了。 就是需要在 函数前面的位置 用 global 关键字 进行声明 num, 这样解释器 就能明白我现在要 更改的是一个全局变量里面的num.

    2-3 在函数中定义自己的变量

    思考一下:
    如果想没有添加 global 声明 ,然后直接修改num 的值 ,会有什么结果呢?

    # -*- coding: utf-8 -*-
    
    num = 10000000
    print(f"module num:{num}")
    
    
    def visit_num():
        # modify num
        num = 0
        print("modify  num done.")
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
        pass
    

    结果如下:
    img-06

    可以看出 这里并没有把num 的值 修改,原因是 在visit_num 中定义了一个新的 num 变量,这个变量 和外层的变量 不在一个scope 里面, 一个是局部变量,一个是全局变量。 所以 python解释器 就可以知道这是新定义的一个变量。 和外层的模块级别的 num 变量没有关系。

    所以 简单总结一下, 如果在函数中定义了一个和模块级别的变量的相同的名称,这两个变量 是 不相互影响的。

    但是如果都在模块级别定义相同的变量名称,就会出现变量名 被覆盖的情况。 不论这个变量出现在 for 循环,还是 其他的任何位置,只要 这段代码被执行了,就会覆盖之前的变量。

    
    num = 1000
    
    for num in [1, 2]:
        pass
    

    但是有一种比较特殊的情况,对于列表推导式的情况下,它的循环变量只在 自己的列表推导式里面, 出了列表推导式,变量就不存在了。

    
    >>> l = [num ** 2 for num in range(5)]
    >>> l
    [0, 1, 4, 9, 16]
    >>> num
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    NameError: name 'num' is not defined
    

    对于推导式的作用域就类似 在函数里面了, 出了列表推导式,变量 就失效了。

    总结

    平常还是要多留意不同语言之间的差别,每一种语言的设计,都有每一种语言的设计理念,只有理解的作者的理念,才能体会到语言之美,不断总结吧,也给自己一个小小的教训,不要想当然的认为 ,这个应该是这样的,多去实践,来去检查自己的想法。

    分享快乐,留住感动. '2020-10-24 09:54:18' --frank
    展开全文
  • 其中的 i=i+5 这一行不会改变for循环中i的值,for循环变量i会取哪些值,是第一次进入循环时就决定了的。无论在循环中做什么事都不会改变循环的起始,中止,或步长值。要想实现想要的功能,可以使用while ...

    如下代码: 

    for i = 1:10
        if i==3
    	  i=i+5;
        end
    end
    

    其中的 i=i+5 这一行不会改变for循环中i的值,for循环变量i会取哪些值,是第一次进入循环时就决定了的。无论在循环中做什么事都不会改变循环的起始,中止,或步长值。要想实现想要的功能,可以使用while

    展开全文
  • JS for循环变量问题

    千次阅读 2020-06-01 13:52:19
    下面的代码如果使用var,最后输出的是10。...所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。 如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。 var a = []; for (le

    下面的代码如果使用var,最后输出的是10。

    var a = [];
    for (var i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6](); // 10
    

    上面代码中,变量ivar声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。

    如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。

    var a = [];
    for (let i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6](); // 6
    

    上面代码中,变量ilet声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。

    展开全文
  • 先来看一组简单代码,引出这篇博客的核心 for(var i=0;i<9;i++){ console.log(i); //依次输出0.1.2.3.4.5.6.7.8 ...在这段代码中,在函数内部,i的值为确定的9,这是因为for循环{}没有块...

    先来看一组简单代码,引出这篇博客的核心

    for(var i=0;i<9;i++){
        console.log(i);     //依次输出0.1.2.3.4.5.6.7.8
        function f() {
            console.log(i);;
        }
    }
    f();//输出单个9
    

    在这段代码中, 在函数内部,i的值为确定的9,这是因为for循环{}没有块级作用域的概念,在通过作用域链引用i时引用的是全局变量对象中的i,在全局作用域中只有一个确定的i值,也就是for循环完毕之后的i的值:9。

    下面介绍几种可以使函数内部可以获取到循环变量i的方法,先来看一组错误的实例

    allList = $("tab_header").getElementsByTagName("li");
    doms = $("tab_content").getElementsByClassName("dom");
    for(var i=0;i<allList.length;i++){
        allList[i].onmouseover = function () {
           allList[i].className = "selected"
            doms[i].style.display = "block";
        }
    }

     这是for循环中绑定的DOM事件,allList、doms为获取到的包含多个DOM对象的数组,在这之中,我们期望通过for循环改变这两个数组中所有DOM对象的属性,但是通过了解上面的简单代码,如果我们用i来作为索引,那么allList[i]其实与allList[(allList.length+1)]是等价的,但数组中allList[(allList.length+1)]是undefined(想象一下,数组长度为6,索引是从0开始的,那么他存在索引为6的值吗,)所以我们期望修改的每个DOM对象的属性是无法完成的。

    如果想要使代码符合我们的期望,可以通过以下两种方法

    1.for循环时把循环变量i作为DOM对象的属性绑定到每个DOM对象上面,代码如下

    allList = $("tab_header").getElementsByTagName("li");
    doms = $("tab_content").getElementsByClassName("dom");
    for(var i=0;i<allList.length;i++){
        var sli = allList[i];
        sli.index = i;  //可以缩写为allList[i].index = i;
        allList[i].onmouseover = function () {
            this.className = "";
            doms[this.index].style.display = "block";
        }
    }

    在这里,我们一个重要的思想就是,我们不需要拿到i这个变量,我们只需要拿到每次循环的变量i的值!

    在这段代码中,我们把每次循环的 i 作为数组单个DOM的index属性绑定在了DOM中(实例化的场景,就好像五个兄弟img标签,我们通过这种方法给他们绑定了值分别为0.1.2.3.4的id),这样每次循环的i的值就会绑定在对应的DOM对象里。看到这里,我们期望的红色部分的代码应该是allList[sli.index],但是别忘了,sli也是通过索引i来赋值的,所以sli的值为allList[(allList.length+1)],要解决这个问题,在这里我们引入this对象这个知识点,this对象代表的是每次循环时的allList[i](也就是循环到的单个DOM对象)。这样通过this.index可以获得i的值(注意,上面说到了,是i的值而不是i这个变量)

    2.立即执行函数中进行闭包

    这里的闭包可以通过两种方法,但是统一的思想都是把变量i作为参数传入到立即执行函数中。

    ①第一种闭包,把i作为一个参数传进去,直接将立即执行函数赋值给事件。

    allList = $("tab_header").getElementsByTagName("li");
    doms = $("tab_content").getElementsByClassName("dom");
    for(var i=0;i<allList.length;i++){
        (function (x) {
            allList[i].onmouseover = function () {
                allList[x].className = "selected";
                doms[x].style.display = "block";
            }
        })(i);

     

    ②第二种闭包,立即执行函数,利用return在闭包中返回

    allList = $("tab_header").getElementsByTagName("li");
    doms = $("tab_content").getElementsByClassName("dom");
    sli.onmouseover = (function (x) {
        return function () 
            allList[x].className = "selected";
            doms[x].style.display = "block";
                }
            })(i);
    }

    在这两种闭包里面,都是添加了立即执行函数,然后让事件/事件对应的函数在立即执行函数中执行。我们把每次循环的变量i作为实参,把他的值赋予形参x,这时候由于每次循环都会立即执行函数(这里涉及到同步异步的问题,立即执行函数是同步操作,其它函数是异步操作),相当于每次循环都创建了一个函数,此时可以获得当前循环中的i的值,然后把i的值传给形参并保存在形参的内存中。举一反三,通过对this对象的了解其实在这里我们也可以用this来代表allList[x],但是为了不引入this对象这个知识点以致逻辑混乱,我们用了allList[x],但this可以代表allList[x]这个我们是需要知道的。

    最后做一个总结:对于以上三种方法,共同的思想都是把循环中的变量i的值保存下来,只不过第一种方法把变量i的值保存在了DOM对象的属性中,后两种方法把变量i的值保存在了立即执行函数的形参中。

    以上便是所有,另对于其中的一些代码,还可能存在疑惑的地方做一些补充:

    1.上面用到了(函数)(),即(function (x) { return function () allList[x].className = "selected"; doms[x].style.display = "block"; } })(i);关于这个的解释请先从以下代码看起

    function f1() {
      函数体  
    }
    

    f1();

    我们知道对于一个函数,f1()就是对函数的执行,那么对于上面的函数,剖析来看是这样的:(function (x) {函数体})(i);也就是立即执行函数。

    其中包裹整个函数的括号的含义请看以下博客:

        深入理解JS中的立即执行函数

    对于同步异步操作的问题,在文章的第一段代码,在函数中会输出9,因为for循环跟函数声明时异步操作,也就是for循环时,函数不能执行(他存在于任务队列上),只有当for循环结束后,函数才能从任务队列上下来进入执行阶段,故此时i值确定,那么这个事件所对应的函数也就是为一个确定的函数.

    在下面这个代码中,我们利用了立即执行函数,此时每次循环都会立即执行该函数,理解为同步操作,也就是每次循环我们都会创建一个函数,并把实参i,也就是循环中i的值保存在立即执行函数中,然后通过一个闭包来调用,这样即使函数执行完毕后,闭包函数还依然存在着对i的使用,让i不会被销毁

    for(var i = 0;i<9;i++){
        (function(){
            console.log(i);   //输出0.1.2.3.4.5.6.7.8
            function f() {
                console.log(i);//输出9
            }
        })();
    }

     

    展开全文
  • python中for循环中的循环变量

    千次阅读 2020-01-01 14:24:00
    废话不多说,代码伺候: for i in range(3): ...说明循环变量i,在遍历完之后值并没有消失,而是保留了最后一次遍历时变量i的值!所以平时在使用的时候变量最好别和模块其他变量重复,否则可能出问题! ...
  • [removed],循环变量 不参与运算只循环[removed],循环变量 不参与运算只循环[removed],循环变量 不参与运算只循环
  • 在循环内部改变循环变量

    千次阅读 2017-11-19 17:06:48
    int main() { int i = 0; int arr[2] = { 0 }; for (i = 0; i { arr[i] = 1; printf("%d\n",i);// 0 1 2 3 1 2 3 1 2 3 然后以1 2 3死循环 } ...//i和arr[2]是局部变量,在栈里,对栈的
  • 本文主要将在shell中如何编写for循环,并将循环变量作为下个shell脚本的参数。
  • kettle通过在job中变量来实现循环的例子:首先从文本文件读取表名,然后循环一个个表读取数据,其中最开始的文本文件输入表名可以改为从其他地方输入(比如表输入,网络请求等)
  • matlab中for循环的循环变量在循环体中不能改变 for i = 1:50 if... i=i-1 else ... end i-1是不会起作用 用while吧
  • 使用嵌套for循环加break练习打印99乘法表时的代码 #!/usr/bin/bash for i in {1..9} do if [ $i -eq 1 ];then echo "1 * 1 = 1" else # echo $i for j in {1..$i} ...
  • 通常情况下,使用for循环可以通过递增,也可以通过递减,使用递减遍历代码如下: - (void)testFor { NSString *string = @"信不信由你"; for (int i = string.length - 1; i &gt;= 0; i--) { ...
  • js中for循环变量作用域

    千次阅读 2019-06-16 22:14:45
    click事件的父级作用域的上级是for循环,在每次循环中let声明变量i,而不是同一个变量i被重新赋值 let声明,当前的变量只在本轮循环有效,所以每一次循环的i其实都是一个新的变量 for (let i = 0; i ; i++) {...
  • 首先先讲解下for循环语句的工作原理...作用是给循环控制变量赋初值 表达式2相当于是for的循环条件 表达式3是重复执行的内容;通常是改变循环控制变量值的语句 for语句的应用格式: for (循环初始; 循环条件; 循环控...
  • 第十一课 for循环(3)---循环变量的变化 【for循环流程】   前面介绍的for循环语句,学习了简单控制循环次数的格式,一般形式为:  for( int i=0; i; i++ )  语句/复合语句;   在学习了if语句中的逻辑表达式...
  • [python笔记]for循环中循环变量迭代问题在python中,for循环相当于一个迭代器,在循环体中改变循环变量的值对循环次数是没有影响的。
  • matlab之在循环中修改循环变量

    万次阅读 2017-06-16 16:48:34
    matlab有特定的for循环形式,如for i=1:10,这个循环每次都会在已定的向量中取值。 如果写作: for i=1:10 ... i=i+2; ...如果想要在每次循环中改变循环变量,可以使用while 如 while i ... i=i+2;
  • 易错点:for循环中循环变量的更新所带来的问题标签:C语言 for循环 易错点by 小威威1.for循环的介绍for循环的格式如下: for (表达式1;表达式2;表达式3) 其中,表达式1指初始化表达式,表达式2指循环条件表达式...
  • for循环绑定事件时,var和let声明循环变量的区别

    千次阅读 多人点赞 2018-03-31 20:24:54
    在理解var、let、const三者在声明变量的区别时,遇到了一道十分有意思的题:&lt;body&gt; &lt;ul&gt; &lt;li&gt;第一个li&lt;/li&gt; &lt;li&gt;第二个li&lt;/li&...
  • 第六课for循环(2)---使用循环变量

    千次阅读 2015-09-30 00:50:08
    第六课 for循环(2)---使用循环变量循环变量】 上节课样例程序中使用了c++的for循环语句的简单形式,基本格式为: for (int i=0; i < N; i++ )   语句/复合语句; 其中: l 第1部分“ int i=0 ”表示在循环...
  • JAVA for循环变量问题

    2015-12-20 13:04:34
    为什么j++和++j的输出会天壤之别?求大神指教!![图片](https://img-ask.csdn.net/upload/201512/20/1450616583_963303.jpg)![图片](https://img-ask.csdn.net/upload/201512/20/1450616593_244300.jpg)
  • matlab中for循环的循环变量在循环体中不能改变的问题最近一直在写java,写习惯了,发现写matlab还是挺不习惯的,由于本人是通信专业的学生,因此,也就避免不了要做一些仿真,也就避免不了要写了一些matlab程序,...
  • 预处理机制:批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也...
  • js中的循环变量声明

    千次阅读 2016-04-21 16:14:48
    建议加上var
  •  循环过程并没有将所有的jar文件合在一起,只是加入了一个文件。 (2)原因分析  原因是什么呢?和批处理文件的解释机制有关。下面是延迟环境变量的由来恰好解释了这种现象发生的原因: cmd在解释我们...
  • for i=1:3  d=strcat(num2str(i),'abc') t=fopen(d,'w'); fprintf(t,d); end
  • shell 循环变量作用范围

    千次阅读 2015-09-08 08:53:29
    虽然执行了RetVal=1这条语句,但是一出while循环变量值又变成0了。 这是因为管道是在子shell中执行的,子shell中的变量对于子shell之外的代码块来说, 是不可见的. 当然, 父进程也不能访问 这些变量, 父进程指...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,392,564
精华内容 557,025
关键字:

循环变量

友情链接: Numpy及Pandas.zip