当前位置: 首页 > 知识库问答 >
问题:

for循环中变量作用域的困惑

谢承颜
2023-03-14

此代码将引发NameError:名称“i”未定义:

for n in range(2, 101):
    for i in range(2, n):
        if n % i == 0:
            break
    if n % i != 0:
        print(n, end=' |')

此代码将执行而不会出错:

n = 97
if True:
    for i in range(2, n):
        if n % i == 0:
            break
    if n % i != 0:
        print(n, end=' |')

有人能说出原因吗?

共有2个答案

糜宜民
2023-03-14

n为2时,range(2,n)将是一个空列表,因此该循环的主体将根本不执行。

郜光明
2023-03-14

这与作用域无关,实际上python中的for循环不会创建自己的作用域,除非它在列表理解中。 出现错误的原因是i没有在第一个代码中创建。

for n in range(2,101):
# at first iteration n == 2
    for i in range(2,n):
    # this is equivalent to range(2,2) in first iteration

因此,没有要迭代的内容,因此没有将值分配给i。 当它转到n%i时,它抛出NameError

在第二块中:

for i in range(2, n):
# value if i is 2

由于i有一个值,因此定义了它,它不会抛出NameError

 类似资料:
  • 问题内容: 我不是在问Python的作用域规则。我大致了解作用域在Python中用于循环的原理。我的问题是为什么设计决策是以这种方式做出的。例如(无双关语): 上面将打印(9,2)。 这让我感到很奇怪:“ foo”实际上只是在控制循环,而“ bar”是在循环内部定义的。我能理解为什么可能需要在循环外部访问“ bar”(否则,for循环的功能将非常有限)。我不明白的是为什么循环退出后,控制变量必须保

  • 本文向大家介绍浅谈shell循环中变量的作用域问题,包括了浅谈shell循环中变量的作用域问题的使用技巧和注意事项,需要的朋友参考一下 最近实现了一个shell脚本,功能简单来说就是从文件中按行读取然后将所有行拼接成一行写入一个文件,关键代码如下 结果执行结果竟然是空!按照常理shell中的变量默认是全局变量,不会存在变量作用域的问题,于是上网查了下,发现问题出在while上 while循环读取文

  • 在for循环中,为不同的变量分配一个值。已经赋值的变量将从下一次迭代中获得赋值。最后,两个变量的值相同。该代码用于验证文件中的数据。当我打印这些值时,它会为第一次迭代打印正确的值,但在下一次迭代中,第一次迭代中指定的值会更改。当我在for循环中打印$value3和$value4的值时,它会为$value4显示null,为$value3显示一些值,但在下一次迭代中,$value3的值会被$value

  • 我最近在一个在线java测试中编写了这段代码。它位于一个设置为返回整数的方法中。我收到了一条类似“变量a没有赋值”的错误消息。我觉得这很奇怪,因为forloop必须能够访问methods变量,并且必须注册循环中的赋值,对吗? 我确实假设该方法将返回整数5。 这只是一个关于变量a范围的问题。我知道代码没有意义。

  • 问题内容: 我试图用多个变量在Go中编写一个for循环。 来自javascript世界,我想实现以下目标: 我已经尝试过像这样的“原始翻译”: 但这是行不通的。正确的语法是什么? 非常感谢! 问题答案: 在Go中,您可以像这样循环执行多个变量分配。

  • 在循环中,我是否可以对循环使用相同的计数器变量? 或者这些变量会相互影响吗?以下代码应该为第二个循环使用不同的变量,例如,还是可以?

  • 问题内容: 在循环内部声明变量是否不好?在我看来,这样做,如下面的第一个代码块所示,将使用第二次的十倍的内存…由于在循环的每次迭代中都创建了一个新的字符串。这样对吗? 与 问题答案: 在循环内部声明变量是否不好? 一点也不!它将变量本地化到其使用点。 在我看来,如下面的第一个代码块所示,这样做将使用十倍于第二个内存的内存。 编译器可以优化内容以保持内存使用效率。仅供参考:如果您使用关键字告诉您变量

  • 我需要构造一组变量,其中变量应基于2部分构造:a)name b)一个用value[1]加强的数字。对于不断增加的数字,我使用了for循环。我设法创建了一个字符串,参见test1,但没有增加变量名称,参见test2。 鉴于下面提供的错误代码,我假设R不希望我使用变量名中的“paste0”来构造某些东西。 我的R代码: “测试1”的结果: 我得到的test2错误是: “test2”的预期结果是: