为什么不执行(" break")在while循环中工作

时间:2016-11-15 14:07:32

标签: python while-loop exec

正如问题所示,为什么以下代码不起作用:

func pickerView(UIPickerView, numberOfRowsInComponent: Int)

我通过python 3.5.2控制台在pycharm中执行上面的操作。 我最初认为这是一个背景问题,但在阅读完文档之后,我还没有理解为什么会出现这种错误。

while True:
      exec("break")

提前致谢:)

编辑:我知道它在没有exec()的情况下有效,我很好奇为什么它不能与exec一起工作(因为我的情况需要它) - 全面的欢迎回答。

6 个答案:

答案 0 :(得分:3)

这是因为exec()对你周围的循环无知。因此exec()在您的示例中看到的唯一声明是break。不要使用exec("break"),只需按原样使用break

exec()功能对其周围范围的唯一访问权限是globals()locals()词典。 The documentation for exec()提供了exec()如何运作的一些见解:

  

此函数支持Python代码的动态执行。 object必须是字符串或代码对象。如果它是一个字符串,则将该字符串解析为一组Python语句,然后执行该语句(除非发生语法错误)。 [1]如果是代码对象,则只执行它。在所有情况下,执行的代码应该作为文件输入有效(请参见“参考手册”中的“文件输入”部分)。请注意,即使在传递给exec()函数的代码的上下文中,也不能在函数定义之外使用return和yield语句。返回值为None。

     

在所有情况下,如果省略可选部分,则代码在当前范围内执行。如果只提供全局变量,则它必须是字典,它将用于全局变量和局部变量。如果给出全局变量和局部变量,则它们分别用于全局变量和局部变量。如果提供,则locals可以是任何映射对象。请记住,在模块级别,全局变量和本地变量是相同的字典。如果exec获得两个单独的对象作为全局变量和本地变量,则代码将被执行,就好像它嵌入在类定义中一样。

     

如果全局字典不包含键 builtins 的值,则在该键下插入对内置模块内置字典的引用。这样,您可以通过将自己的 builtins 字典插入到globals中,然后将其传递给exec()来控制已执行代码可用的内置函数。

答案 1 :(得分:2)

exec语句独立于代码的其余部分运行一些代码。

因此,行:

exec("break")

等于无处不在地调用break,在没有其他任何事情发生的脚本中,并且没有循环存在。

调用break语句的正确方法是:

while True:
    break

修改

Leaf的评论让我想到了它。

实际上,exec语句不会无处运行代码。

>>> i = 12
>>> exec("print(i)")
12

据我了解,更好的答案是exec在与原始代码相同的环境中运行一段代码,但独立于此。

这基本上意味着调用exec时存在的所有变量都可以在exec调用的代码中使用。但是上下文是全新的,因此除非创建了正确的上下文,否则returnbreakcontinue和其他需要上下文的语句将无效。

顺便说一句,我保留了#34;声明"在谈论exec时,它已成为Python3中的一个函数,与print的方式相同。

答案 2 :(得分:2)

exec()是一个功能。假设为简单起见,函数调用构成了它自己的语句(就像在你的例子中一样),它可能以下列方式之一结束:

  1. 函数正常返回 - 在这种情况下,执行根据控制流程的下一个语句;

  2. 从函数引发/抛出异常 - 在这种情况下,执行调用堆栈上的匹配except子句(如果有)

  3. 整个程序因显式调用exit()或等效函数而终止 - 没有任何东西可以执行。

  4. break内部调用return(以及yieldexec())会以与所描述的方面不相容的方式修改程序执行流程函数调用语义。

    请注意,the documentation on exec()包含有关在return内使用yieldexec()的特别说明:

      

    请注意,returnyield语句不得在外部使用   甚至在传递给的代码的上下文中的函数定义   exec()功能。

    类似的限制适用于break语句(区别在于它不能在循环之外使用),我想知道为什么它没有包含在文档中。

答案 3 :(得分:1)

exec是一个内置函数,

Python坚持认为break应该在循环中发生,而不是在function

您的代码中发生的事情是您将break置于function exec内,break您无法通过执行 在循环内调用的函数中的>>> def func(): break SyntaxError: 'break' outside loop >>>

对于Ex

stack

答案 4 :(得分:0)

在没有exec()的情况下尝试break:

while True:
  break

答案 5 :(得分:0)

exec函数在代码内部运行代码,这意味着它无处不在!因此,您的while循环无法捕获它。您的文件为<stdin>exec在另一个名为<string>的文件上运行。它无法识别您试图在没有循环的地方打破循环的地方。因此,您的代码是这样的:

while True:
    exec("break")

应该是这样的:

while True:
    break