列表推导式中列表与元组迭代差异:单元素元组输入为何行为不同?
问题解析:为何单个元组的列表与“单个元组的元组”输入表现不同?
核心问题:你定义的“元组的元组”其实不是元组的元组
你遇到的差异根本原因在于entry_tuple_tuple = (('val1', 'val2'))这行代码并没有创建包含单个元组的元组,外层的括号在这里只是语法上的分组符号,没有实际构造嵌套元组的作用。这个变量本质上和('val1', 'val2')完全等价——就是一个普通的二元元组。
在Python中,要创建只包含单个元素的元组,必须在元素末尾加上逗号,正确的写法应该是:
entry_tuple_tuple = (('val1', 'val2'),) # 注意末尾的逗号
函数执行逻辑对比
我们来拆解两种输入下change函数的执行过程:
输入是单个元组的列表
[('val1', 'val2')]entries是一个列表,里面的每个元素是元组('val1', 'val2')- 列表推导式遍历
entries时,每次拿到的entry就是这个完整的二元元组 '\t'.join(entry)会把元组里的两个字符串用制表符连接,得到'val1\tval2',最终输出['val1\tval2'],符合预期。
输入是你定义的
entry_tuple_tuple(实际是二元元组)entries此时是('val1', 'val2'),也就是一个包含两个字符串的元组- 列表推导式遍历这个元组时,每次拿到的
entry是单个字符串:'val1'和'val2' - 而
str.join()方法接受的可迭代对象如果是字符串,会把字符串的每个字符作为迭代项——所以'\t'.join('val1')会把'v'、'a'、'l'、'1'用制表符连接,得到'v\ta\tl\t1',同理'val2'变成'v\ta\tl\t2',最终输出['v\ta\tl\t1', 'v\ta\tl\t2']。
验证修正后的代码
把entry_tuple_tuple改成正确的嵌套元组写法后,执行结果就会和列表输入一致:
def change(entries): return ['\t'.join(entry) for entry in entries] entry_tuple_list = [('val1', 'val2')] print(change(entry_tuple_list)) # 输出: ['val1\tval2'] entry_tuple_tuple = (('val1', 'val2'),) # 加上末尾逗号 print(change(entry_tuple_tuple)) # 输出: ['val1\tval2']
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

