Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用exec';Python3中的加密字符串_Python_Python 3.x_Python Internals - Fatal编程技术网

使用exec';Python3中的加密字符串

使用exec';Python3中的加密字符串,python,python-3.x,python-internals,Python,Python 3.x,Python Internals,为什么下面的python3代码会产生错误 a='' def x(): 印刷品(42) ''' 课堂测试: 定义初始化(自): 行政主任(a) x() t=测试() 此消息中的结果: 回溯(最近一次呼叫最后一次): 文件“bug.py”,第11行,在 t=测试() 文件“bug.py”,第9行,在_init中__ x() NameError:未定义全局名称“x” 我假设您使用的是Python3.x,因为在Python2.7中,您的代码对我来说运行良好。 因此,对于Python3.x,更改行 ex

为什么下面的python3代码会产生错误

a=''
def x():
印刷品(42)
'''
课堂测试:
定义初始化(自):
行政主任(a)
x()
t=测试()
此消息中的结果:

回溯(最近一次呼叫最后一次):
文件“bug.py”,第11行,在
t=测试()
文件“bug.py”,第9行,在_init中__
x()
NameError:未定义全局名称“x”

我假设您使用的是Python3.x,因为在Python2.7中,您的代码对我来说运行良好。 因此,对于Python3.x,更改行

exec(a)

以便将
x
添加到全局命名空间

Python3还采用映射类型的
globals
locals
可选参数,作为给定代码执行的上下文:

exec(object[, globals[, locals]])
默认情况下,会为这两个对象传入本地范围。执行的代码可以使用它,也可以修改dict,但它对实际的局部范围没有影响。参见和示例:

a = '''
print(t)

def x():
    print(42)
'''

class Test:
    def __init__(self):
        t = 'locals are accessible'
        # same as calling exec(a, locals())
        exec(a)
        print(locals())
        x()

t = Test()
输出:

locals are accessible
{'x': <function x at 0x6ffffd09af0>,
'self': <__main__.Test object at 0x6ffffce3f90>,
't': 'locals are accessible'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 13, in __init__
NameError: global name 'x' is not defined

注意:
exec
只是Python2.x中的一个简单语句,而它是Python3.x中的一个函数

Python 2.7 让我们检查通过执行
a
所做的更改

class Test:
    def __init__(self):
        l, g = locals().copy(), globals().copy()
        exec a           # NOT a function call but a statement
        print locals() == l, globals() == g
        x()

t = Test()
输出

False True
42
False True
NameError: name 'x' is not defined
这意味着,它改变了
locals
字典中的某些内容。如果在
exec
之前和之后打印
locals().keys()
,您将在
exec
之后看到
x
。根据

在所有情况下,如果省略了可选部分,则代码将在当前范围内执行

所以,它完全按照文档中所说的做

Python3.x: 当我们在Python3.x中执行相同的操作时,我们得到了类似的结果,只是我们得到了那个错误

class Test:
    def __init__(self):
        l, g = locals().copy(), globals().copy()
        exec(a)          # Function call, NOT a statement
        print(locals() == l, globals() == g)
        x()
输出

False True
42
False True
NameError: name 'x' is not defined
连政府都说,

在所有情况下,如果省略了可选部分,则代码将在当前范围内执行

但它的底部还包括一个注释

注意:默认局部变量的作用与下面的函数
locals()
所述相同:不应尝试修改默认局部变量字典。如果需要在函数
exec()
返回后查看代码对局部变量的影响,请传递一个显式局部变量字典

所以,我们好奇地检查了一下,发现

注意:本词典的内容不得修改;更改可能不会影响解释器使用的本地变量和自由变量的值

因此,解释器不接受对
locals()
对象所做的更改。这就是为什么它不能识别本地范围中定义的
x

但当我们这样做的时候

def __init__(self):
    exec(a, globals())
    x()

它可以工作,因为我们将它添加到
globals
字典中。Python尝试首先在本地范围内,然后在类范围内,然后在全局范围内查找
x
,然后在那里找到它。因此,它可以毫无问题地执行它。

eval()
exec()
?问题标题和代码相互矛盾。另一个有趣的问题:你想用exec实现什么,以及Python更自然的实现方式是什么?大量的先例回答了你的问题;例如,在Python 2中,
exec
是一个语句,而不是一个函数。当您使用
exec
时,编译器将禁用本地命名空间优化,这就是它在那里工作的原因。Python3不再这样做了。非常好的注释。在我的例子中,“如果需要在函数
exec()
返回后查看代码对局部变量的影响,请传递一个显式的
locals
字典。”这正是我徒劳地寻找的模糊解决方案。我不再害怕了。谢谢这正是我需要的!从
字符串
代码本地保存函数并在本地范围内调用它而不影响程序的全局范围的一种方法。好极了:)同样,这正是我需要的,谢谢!您好@amousgarkin,您在哪里知道“默认情况下,本地范围会同时传递给这两个对象”?
exec
函数签名中没有显示默认值