代码之家  ›  专栏  ›  技术社区  ›  titiree

为什么eval('“\x27”')==eval('“\\x27”')?

  •  6
  • titiree  · 技术社区  · 7 年前

    我很困惑于python的eval():

    我试过了 eval('"\x27"') == eval('"\\x27"') 评估结果是 True 是的。有人能解释一下为什么会这样吗?两个表达式的计算结果都是 "'" 是的。我明白为什么 eval('"\x27"') 是(计算的字符串只有一个字符,它是一个转义的十六进制,表示一个撇号),但不应该 eval('"\\x27"') 等于 "\\x27" 是吗?

    其次,如果我设置了以下变量,就更加混乱了,

    s = "\x27"
    t = "\\x27"
    

    然后 eval('s') 又来了 “'” ,但是 eval('t') “\\x27” .为什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Nearoo    7 年前

    根据文件, eval “将参数作为python表达式进行分析和计算”。换言之,它应用的处理与您编写 x = "foobar \n" 在程序或空闲程序中。在这个例子中, \n 转换为换行符(注意,它与文本不相同 \ n个 )中。

    如果你打字 x = "\x27" 闲着的时候,你会得到 x == "'" 是的。这个 x27 逃脱 因为反斜杠,所以 改变 在期间 评价 .如果你 避开反斜杠 ,然后 X27层 在评估期间更改。相反,您只需得到一个带有反斜杠的字符串,后跟 X27层 是的。

    如果你计算了这个字符串 再一次 ,您只剩下一个反斜杠-似乎在转义 X27层 是的。因此,改为 ' 是的。

    另一种方法是: eval("\x27") 计算参数 两次 ,但它只是第一次更改为 "'" 是的。 eval("\\x27") 同时对参数求值两次,第一次为 \x27 ,然后转到 “'” 是的。


    下面是一个简单的例子来演示这是如何工作的:

    >>> x = "\"foobar\""
    >>> x == "foobar"
    False
    >>> x == "\"foobar\""
    True
    >>> x = eval(x) # changes value of x from "foobar" to just foobar. Still string though, thus still ""
    >>> x == "foobar"
    True
    >>> x == "\"foobar\""
    False
    

    像这样看:右手边 y = "2" 包含两个组件: y 应该是字符串类型,使用 " ,以及 价值 由字符表示的字符串的 2 是的。这两个方面的分离是在 评价 你写的代码。字符串对象本身从未看到 “。” 在初始化期间。

    在上面的例子中,在第一行之后 x 类型 str 有价值的 "foobar" 是的。如果你评估一下 再一次 ,和 “。” 这次被解释为 价值 属于 但是作为 类型 属于 是的。所以 eval("\"foobar\"") 基本上改变了 一串 “美食家” foobar ,如果要使用python语言,则必须编写为 "\"foobar\"" “美食家” 是的。

        2
  •  1
  •   dhke    7 年前

    为了 '"\x27"' 反斜杠转义在解析期间展开,因此 '"\'"' 是的。 '"\\x27"' 只去除反斜杠,即它等于 r'"\x27"' 是的。

    直达的 eval() 在字符串文本上添加另一个特殊字符扩展的迭代:在第一种情况下, \' 是一个 valid escape sequence 顺从的 ' 是的。第二种情况同上。

    使用变量名时,分配值时仅执行一轮取消隐藏。 eval('s') 简单地扩展到 s 没有进一步的逃避。如果你想模仿第一个案例,你需要 eval(s) ,即计算由 S公司 是的。