繁体   English   中英

对迭代变量的更改未反映在原始列表中

[英]Changes to iteration variable not reflected in original list

我正在尝试实现HTML转义功能

这是我的代码:

def escape_html(s):
    for x in s:
        if x == '>':
            x = "&gt"
        elif x == '<':
            x = "&lt"
        elif x == ' " ':
            x = "&quot"
    return s

s = "dasdasdas > < "
print escape_html(s)

我的输出与我的输入完全相同。 为什么不替换字符?

预期产量:

dasdasdas &gt &lt 

实际输出:

dasdasdas > < 

for循环遍历给定的iterable,并in每次循环中在in之前设置变量。 和其他变量一样。 如果您尝试这样做:

my_list = [1, 2, 3]
x = my_list[1]
x = 5

这样一来,您的my_list末尾就不会等于[1, 5, 3] my_list [1, 5, 3] 没有,而不是改变你得到了x的,你只要重新绑定x 您的x相同的问题。 你需要明确地把它放回到s莫名其妙。

无论如何, 如果您实际上想转义HTML,请使用cgi.escape

与@icktoofay所说的一样, x将采用s中每个字符的值。 您如何期望一个字符等于' " ' ?您可能应该改用索引。这是函数的修改版本, cgi.escape您的要求(但是仍然很不完整,但是cgi.escape是最好的方法) :

>>> def escape_html(s):
        x = ''
        for i in range(len(s)):
            if s[i] == '>':
                x += "&gt"
            elif s[i] == '<':
                x += "&lt"
            elif s[i:i + 3] == ' " ':
                x += "&quot"
            else:
                x += s[i]
        return x


>>> print escape_html("dasdasdas > < ")
dasdasdas &gt &lt 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM