Python str比较在控制台和函数内有所不同

时间:2015-07-12 06:40:42

标签: python string string-comparison

在控制台(我认为正确)和函数内部(我认为不正确)之间进行布尔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返回如下;

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

那么为什么它会在' xyz'如果我正在寻找' x'?

3 个答案:

答案 0 :(得分:2)

在您测试的控制台中:

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

在你的程序中测试

'x' in 'xyz'

换句话说,你不是喜欢比较。两个表达式在控制台和程序中以相同的方式进行评估。

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

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

你没有展示你如何调用你的功能,但我们可以推断你做了什么。你写了这样的东西:

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

似乎出现了混乱,因为您认为您已将整个列表传递给f(),但您没有。您迭代了列表并将每个项目一个接一个地传递给f()

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

在长篇评论中,你认为你的代码是:

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

但这不是你写的代码。

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

答案 1 :(得分:0)

嗯,字符串x中的不是 xyz? :)

Python将字符串视为单字符字符串的可枚举容器(Python没有字符类型)。因此,根据Python,容器'x'中的元素'xyz'

我确定如果您在提示中评估'x' in 'xyz',则会返回True

答案 2 :(得分:0)

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

我们假设你做了两件事之一:

  • 在函数

    中使用其他变量名

    这具有不屏蔽s的额外好处,并会在您检查s时返回您的预期。

    'x' in s

    一个严重的缺点是变量def f(v): print 's in f(s) looks like: ', s, 'x' in s return 'x' in s 非常无用,并且可能可以用来代替v

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

    这具有额外的好处,即不依赖于可能发生异想天开的变化的本地/全局变量。

    'x'