打印语句强制转换为list会破坏列表吗?

2024-04-25 14:01:13 发布

您现在位置:Python中文网/ 问答频道 /正文

谁能解释一下:

听写列表为:

dict_list = [
{'a':1, 'b':3},
{'a':2, 'b':4}
]

案例A(清单已销毁)

然后输入以下代码:

1 print('length: ' + str(len(dict_list)))
2 filtered_dict_list = filter(lambda d: d['a'] == 1, dict_list)
3 print('length: ' + str(len(list(filtered_dict_list))))
4 dict_list = list(filtered_dict_list)
5 print('length: ' + str(len(dict_list)))

将打印:

length: 2
length: 1
length: 0

字典列表在代码中永远消失了

案例B(清单未销毁)

通过切换3号线和4号线:

1 print('length: ' + str(len(dict_list)))
2 filtered_dict_list = filter(lambda d: d['a'] == 1, dict_list)
3 dict_list = list(filtered_dict_list)
4 print('length: ' + str(len(list(filtered_dict_list))))
5 print('length: ' + str(len(dict_list)))

我们得到:

length: 2
length: 0
length: 1

并且可以继续使用我们过滤的dict\u列表


Tags: lambda代码列表len字典filterlengthdict
1条回答
网友
1楼 · 发布于 2024-04-25 14:01:13

在python3中,filter()返回一个filter对象,它是一个惰性生成器,不会像python2的filter()那样自动生成一个list对象。在代码中,只需更改先打印哪个结果。你知道吗

1 print('length: ' + str(len(dict_list)))
2 filtered_dict_list = filter(lambda d: d['a'] == 1, dict_list)
3 print('length: ' + str(len(list(filtered_dict_list)))) # consumes filtered_dict_list
4 dict_list = list(filtered_dict_list) # attempts to consume an exhausted generator, saving an empty list
5 print('length: ' + str(len(dict_list))) # length of that empty list

在第二个街区:

1 print('length: ' + str(len(dict_list)))
2 filtered_dict_list = filter(lambda d: d['a'] == 1, dict_list)
3 dict_list = list(filtered_dict_list) # consume filtered_dict_list, and *save* it
4 print('length: ' + str(len(list(filtered_dict_list)))) # attempts to consume an exhausted generator, result is empty
5 print('length: ' + str(len(dict_list))) # print the *saved* dict_list

并不是print()的叫声让发电机排气,而是list()的叫声。如果您将filtered_dict_list发送到print(),而不首先将其发送到list(),它将打印类似<filter object at 0x0000000003E32470>的内容。你知道吗

相关问题 更多 >