无法从列表中删除字符串

时间:2015-09-19 20:24:20

标签: python

我写了以下代码:

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时,会出现错误:fNoneType: None(即,无法在列表中找到该字符串)。

为什么会发生这种情况?

3 个答案:

答案 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) - 他们是"所有副作用"。返回值不变异对象,成功/失败标志。有些语言区分了"程序"和"功能&#34 ;;这些将是"程序"。

如果您想知道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"]