Python中为什么对元组元素进行判断会和想象的结果不一致?

    db = pymysql.connect(host='192.168.89.41', user='root', passwd='root123', port=3306)
    cur = db.cursor()
try:
    cur.execute('show databases;')
    data = cur.fetchall()

    result1 = "('mysql',)" in data
    result2 = "mysql" in data
    result3 = "(\'mysql\'\,)" in data
    result4 = "(\'mysql\',)" in data
    print(data)
    print(result1)

except:
    print("操作 Mysql 失败")

print(data)的输出:

(('information_schema',), ('forum',), ('mysql',), ('mytest',), ('netdisk',), ('network',), ('save_sth',))

print(data[2])

('mysql',)

result1 到 4 的方式都是 False,我错在哪里?


Python中为什么对元组元素进行判断会和想象的结果不一致?

5 回复

data 中的元素都是 tuple,没有一个字符串。


这个问题通常是因为对元组和比较运算符的机制理解有偏差。最常见的情况是使用 in 判断元素是否在元组中时,把元组的括号和元素结构搞混了。

举个例子,假设你写了这样的代码:

t = (1, 2, 3)
result = (1) in t  # 你以为这是在判断1是否在元组t中

这里 (1) 实际上被解释为整数 1,而不是单元素元组。Python中单元素元组必须写成 (1,)。所以上面的代码等价于 1 in t,结果是 True

但如果你真正想判断的是元组 (1,) 是否在 t 中,应该这样写:

t = (1, 2, 3)
result = (1,) in t  # 判断元组(1,)是否是t的元素

这时候结果是 False,因为 t 的元素是数字 1, 2, 3,而不是元组 (1,)

另一个常见问题是嵌套元组:

t = ((1, 2), (3, 4))
result = (1, 2) in t  # 正确:True
result = 1 in t        # 错误:False,因为1不在第一层元素中

总结:注意单元素元组的逗号语法和 in 运算符的查找层级。

Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
>>> data = ((‘information_schema’,), (‘forum’,), (‘mysql’,))
>>> data
((‘information_schema’,), (‘forum’,), (‘mysql’,))
>>> result2 = (‘mysql’,) in data
>>> result2
True
>>>

result1 = “(‘mysql’,)” in data
我一直在想哪个弱类型语言可以这样判断,好像 PHP 也不行吧?

所言极是,我就不能用双引号来表达的内容。。。

,感谢感谢,已解决,小弟的 python 基础非常不扎实,为求出东西快,很多 python 的东西都是跳着摸索的,所以。。。。。。

python 可以啊。。。。笑,跑~~~~~ ^_^

回到顶部