追加一个空列表却变成了NoneType

1 投票
2 回答
4540 浏览
提问于 2025-04-17 10:59

在下面的代码中:

all_subsets = []
subsets = [[], [2]]
left_most = 1 
for subset in subsets:
    print subset
    all_subsets.append(subset)
    all_subsets.append(subset.append(left_most))
print all_subsets

我本以为返回的结果应该是 [[], [1], [2], [2, 1]],但实际上我得到了 [[1], None, [2, 1], None]。也就是说,[] 被转换成了 None

我觉得问题出在循环中两次修改了 subset,而它们指向的是同一个内存地址。不过,即使我在修改列表之前先做一个本地副本,我也无法解决这个问题,比如下面这样:

all_subsets = []
subsets = [[], [2]]
left_most = 1
for subset in subsets:
    print subset
    subset_orig = list(subset)
    subset_plus = list(subset).append(left_most)
    all_subsets.append(subset_orig)
    all_subsets.append(subset_plus)
print all_subsets

有什么想法吗?谢谢!

2 个回答

5

list.append() 这个方法总是返回 None,所以

all_subsets.append(subset.append(left_most))

会把 None 加到 all_subsets 里。你可能只是想要

subset.append(left_most)

因为你在前面的那行代码里已经把 subset 加到 all_subsets 里了。

5

问题在于,append() 这个方法是直接在原来的列表上进行修改的,而且它返回的是 None

这里有一种方法可以修复代码:

all_subsets = []
subsets = [[], [2]]
left_most = 1 
for subset in subsets:
    print subset
    all_subsets.append(subset)
    all_subsets.append(subset + [left_most])
print all_subsets

这样就会得到你期待的结果 [[], [1], [2], [2, 1]]

撰写回答