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'])
但这不是您编写的代码。
您应该接受的主要一点是,行为差异是由于编码差异造成的。您应该学会相信控制台不会以不同方式评估表达式。一旦你相信了这一点,你就会通过查看你的代码来对这些症状做出反应,而不是认为问题出在别处。
在控制台(我认为正确)和函数内(我认为不正确)之间进行布尔 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'])
但这不是您编写的代码。
您应该接受的主要一点是,行为差异是由于编码差异造成的。您应该学会相信控制台不会以不同方式评估表达式。一旦你相信了这一点,你就会通过查看你的代码来对这些症状做出反应,而不是认为问题出在别处。