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

时间:2013-04-16 04:23:31

标签: python python-2.7

我正在尝试实现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 > < 

2 个答案:

答案 0 :(得分:1)

for循环迭代给定的迭代,并在每次in之前通过循环设置变量。它是一个像其他任何变量一样的变量。如果你试过这个:

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

然后你最后没有my_list等于[1, 5, 3];不,而不是改变你x的位置,你只需重新绑定x。您的x遇到了同样的问题。您需要以某种方式明确地将其重新放回s

无论如何,如果您想要实际转义HTML,只需使用cgi.escape

答案 1 :(得分:0)

除了@icktoofay所说的,x将承担s中每个角色的价值。你怎么期望一个角色等于' " '?您可能应该使用索引。以下是您的功能的修改版本,它可以满足您的需求(但仍然非常不完整,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