正如问题所示,为什么以下代码不起作用:
func pickerView(UIPickerView, numberOfRowsInComponent: Int)
我通过python 3.5.2控制台在pycharm中执行上面的操作。 我最初认为这是一个背景问题,但在阅读完文档之后,我还没有理解为什么会出现这种错误。
while True:
exec("break")
提前致谢:)
编辑:我知道它在没有exec()的情况下有效,我很好奇为什么它不能与exec一起工作(因为我的情况需要它) - 全面的欢迎回答。
答案 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
调用的代码中使用。但是上下文是全新的,因此除非创建了正确的上下文,否则return
,break
,continue
和其他需要上下文的语句将无效。
顺便说一句,我保留了#34;声明"在谈论exec
时,它已成为Python3中的一个函数,与print
的方式相同。
答案 2 :(得分:2)
exec()
是一个功能。假设为简单起见,函数调用构成了它自己的语句(就像在你的例子中一样),它可能以下列方式之一结束:
函数正常返回 - 在这种情况下,执行根据控制流程的下一个语句;
从函数引发/抛出异常 - 在这种情况下,执行调用堆栈上的匹配except
子句(如果有)
整个程序因显式调用exit()或等效函数而终止 - 没有任何东西可以执行。
从break
内部调用return
(以及yield
或exec()
)会以与所描述的方面不相容的方式修改程序执行流程函数调用语义。
请注意,the documentation on exec()
包含有关在return
内使用yield
和exec()
的特别说明:
请注意,
return
和yield
语句不得在外部使用 甚至在传递给的代码的上下文中的函数定义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