为什么我的“评估”是这样的?功能不起作用,我认为它可以打印'b',但不是

发布于 2024-08-16 08:26:55 字数 111 浏览 4 评论 0原文

a='''b="ddd"'''
eval(repr(a))
print str(a)
print b

请尝试使用代码,而不是文本,因为我的英语不是很好,谢谢

a='''b="ddd"'''
eval(repr(a))
print str(a)
print b

Please try to use the code, rather than text, because my English is not very good, thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

病女 2024-08-23 08:26:55

使用:

eval(compile(a,'<string>','exec'))

而不是:

eval(repr(a))

脚本:

>>> a='''b="ddd"'''
>>> eval(compile(a,'<string>','exec'))
>>> print str(a)
b="ddd"
>>> print b
ddd

问题是您实际上执行的是语句 'b="ddd"',它不是对 b 的赋值,而是对字符串。

当给定一个字符串时,eval() 内置函数将其作为表达式(而不是语句)进行计算并返回结果。您可以通过给 eval() 提供一个代码对象来运行非表达式代码,该对象是我们上面使用 compile() 创建的。在这种情况下,它会运行代码并返回 None

如果您只需输入以下内容,您就可以看到类似的效果:

>>> 'c=7'
'c=7'
>>> c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>> c=7
>>> c
7
>>> '7=d'
'7=d'
>>> 7=d
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Clearly 7=d is not valid Python, but '7=d' is, 原因如上所述。

expr()repr()compile() 内置函数的描述足以解决这个问题,被发现 此处。在做出这个答案的过程中,没有内置组件受到损害。

Use:

eval(compile(a,'<string>','exec'))

instead of:

eval(repr(a))

Transcript:

>>> a='''b="ddd"'''
>>> eval(compile(a,'<string>','exec'))
>>> print str(a)
b="ddd"
>>> print b
ddd

The problem is that you're actually executing the statement 'b="ddd"' which is not an assignment to b but an evaluation of the string.

The eval() built-in, when given a string, evaluates it as an expression (not a statement) and returns the result. You can get eval() to run non-expression code by giving it a code object, which we create with compile() above. In that case it runs the code and returns None.

You can see a similar effect if you just enter:

>>> 'c=7'
'c=7'
>>> c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>> c=7
>>> c
7
>>> '7=d'
'7=d'
>>> 7=d
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Clearly 7=d is not valid Python, yet '7=d' is, for the reason explained above.

Descriptions of the expr(), repr() and compile() built-ins, adequate enough to work this out, were found here. No built-ins were harmed during the making of this answer.

倾其所爱 2024-08-23 08:26:55

eval 用于计算表达式(获取结果)。您想要的是 Python 代码的动态执行,这是通过 exec 完成的:

>>> a='''b="ddd"'''
>>> exec(a)
>>> print b
ddd

另请注意,在将字符串传递给任一函数之前,不应调用 repr()。您已经有一个字符串,调用 repr() 创建字符串的字符串表示形式。

eval is used to evaluate (get the result of) an expression. What you want is dynamic execution of Python code, which is done with exec:

>>> a='''b="ddd"'''
>>> exec(a)
>>> print b
ddd

Also note that you should not call repr() before passing the string to either function. You already have a string, calling repr() creates a string representation of a string.

心房的律动 2024-08-23 08:26:55

重新考虑您是否真的需要使用eval()。例如,您可以像这样使用 globals()

>>> globals()['b'] = 'ddd'
>>> print b
ddd

但是也许您应该使用的只是一个 字典

>>> my_namespace = dict()
>>> my_namespace['b'] = 'ddd'
>>> my_namespace
{'b': 'ddd'}
>>> print my_namespace['b']
ddd

Reconsider whether you really need to use eval(). For example, you can use globals() like this:

>>> globals()['b'] = 'ddd'
>>> print b
ddd

But perhaps what you should probably be using is just a dictionary:

>>> my_namespace = dict()
>>> my_namespace['b'] = 'ddd'
>>> my_namespace
{'b': 'ddd'}
>>> print my_namespace['b']
ddd
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文