我写了以下代码:
f = copy.deepcopy(features)
if best_att in features:
f = features.remove(best_att)
其中features
是字符串列表,best_att
是字符串。有时代码工作正常,但有时我会遇到以下问题:
例如,features = ['outlook', 'temperature', 'humidity', 'wind']
和best_att = 'outlook'
。调试时,我看到它进入if
。但是,在尝试预先形成remove
时,会出现错误:f
为NoneType: None
(即,无法在列表中找到该字符串)。
为什么会发生这种情况?
答案 0 :(得分:3)
应该是:
f = copy.deepcopy(features)
if best_att in f:
f.remove(best_att)
或
if best_att in features:
features.remove(best_att)
您的代码似乎想要更改原始features
,所以就这样做。如果您还想要深度复制f
,请在修改features
后创建。{/ p>
您收到该消息是因为remove
返回None
:将您的返回值分配给f
后,该f
的值也是None
。一般来说,Python内置的方法可以改变状态"不会返回任何内容" (他们返回best_att
) - 他们是"所有副作用"。返回值
如果您想知道features
是否在features.find(best_att)
中,请使用features.index(best_att)
或data
。
答案 1 :(得分:2)
L.remove
返回None
,然后将其分配到原始列表
help([].remove)
是你的朋友。
答案 2 :(得分:1)
在python中,列表是可变的,您可能已经知道,因为您使用的是deepcopy
如果您在list.remove
上致电f
,则会更改f
并返回None
>>> f = ["spam", "eggs", "harald"]
>>> print(f.remove("harald"))
None
>>> print(f)
["spam", "eggs"]