Python 控制台和函数内的 str 比较不同

Python str comparison differs between console and within function

在控制台(我认为正确)和函数内(我认为不正确)之间进行布尔 str 比较的方式似乎有所不同。即,对于相同的代码和数据,我得到了不同的答案。 控制台:

s
Out[537]: ['a', 'g', 'xyz', 'b', '6', 'g', 'v']

'x' in s
Out[538]: False

'xyz' in s
Out[539]: True

所以这一切现在都说得通了,在一个函数中,我依次获取 s 的每个元素并寻找一个 True return,如下所示;

def f(s):
    print 's in f(s) looks like: ', s, 'x' in s
    return 'x' in s

结果:

Number of required string in list of strings is:  s sent to f(s) is:  a
s in f(s) looks like:  a False
s sent to f(s) is:  g
s in f(s) looks like:  g False
s sent to f(s) is:  xyz
s in f(s) looks like:  xyz True

那么,如果我正在寻找 'x',为什么 return 在 'xyz' 上为 True?

嗯, x 不在字符串 xyz 中吗? :)

Python 将字符串视为单字符字符串的可枚举容器(Python 没有字符类型)。所以根据 Python 元素 'x' 在容器 'xyz'.

中是

我敢肯定,如果您在提示中计算 'x' in 'xyz',它将 return True

您调用此方法的方式可能意味着您正在传递字符串而不是使用列表。您在函数内部也使用了相同的变量 s 也无济于事。

假设您做了以下两件事之一:

  • 在函数中使用不同的变量名

    这具有不屏蔽 s 的额外好处,并且会 return 您在检查 'x' in s 时所期望的。

    def f(v):
        print 's in f(s) looks like: ', s, 'x' in s
        return 'x' in s
    

    一个严重的缺点是变量 v 非常无用,应该 可能 用来代替 'x'

  • 显式传入列表而不是依赖列表的预定义状态

    这有一个额外的好处,即不依赖 local/global 随心所欲变化的变量。

    def f(v, li):
        print 'li in f(s) looks like: ', li, v in li
        return v in li
    

在您测试的控制台中:

'x' in ['a', 'g', 'xyz', 'b', '6', 'g', 'v']

在你测试的程序中

'x' in 'xyz'

换句话说,你不是在比较同类。这两个表达式在控制台和程序中的计算方式相同。


上面的第一个比较测试字符串是否包含在 列表 中。第二个测试字符串是否包含在 string.

这些是完全不同的东西。在前者中,您需要列表中的一个字符串正好等于 'x'。在后者中,您检查是否可以在字符串中找到字母 'x'


你没有说明你是如何调用你的函数的,但我们可以推断出你做了什么。你写了这样的东西:

for str in ['a', 'g', 'xyz']:
    f(str)

混淆似乎是因为您认为您已将整个列表传递给 f() 但实际上没有。您迭代了列表并将每个项目一个接一个地传递给 f()

我怀疑你的命名没有帮助。您将列表命名为 s。但是您也将函数的参数命名为 s。这样在函数内部 s 指的是传递的参数,一个字符串,而在函数外部 s 指的是一个列表。

在长长的评论中,您争论的好像您的代码是:

f(['a', 'g', 'xyz'])

但这不是您编写的代码。


您应该接受的主要一点是,行为差异是由于编码差异造成的。您应该学会相信控制台不会以不同方式评估表达式。一旦你相信了这一点,你就会通过查看你的代码来对这些症状做出反应,而不是认为问题出在别处。