刚学Python的实习生写了个循环,想往列表里加元素,结果把each循环变量一股脑全塞进去了,打印出来发现列表套列表,看了半天才明白append和extend不是一回事。

append就是把一个东西放到末尾

nums = [1, 2]
nums.append(3)
print(nums)   # [1, 2, 3]
nums.append([4, 5])
print(nums)   # [1, 2, 3, [4, 5]]

看清楚,append([4,5])是把整个列表当一个元素塞进去,不是拆开。这正是新手最常踩的坑。想拆开就用extend。

append和extend别搞混

  • append:加一个元素,元素是列表就变成嵌套
  • extend:加一批元素,把里面的东西一个个摊平进原列表
  • 加多个:a.extend([4,5])等于循环append两次,但写法干净
a = [1, 2]
a.extend([3, 4])
print(a)   # [1, 2, 3, 4]

它改的是原列表,不返回值

append没有返回值,返回的是None。写成nums等于nums.append(3),nums直接变成None,后面再用报错AttributeError。这是第二个大坑,一定要记住原地修改。

同理,列表还能用加号合并,但nums加另一个列表会生成新对象,量大的时候比append慢,循环里拼数据一律用append或者列表推导式。

append不适用于哪些类型

字符串没有append,元组也没有,集合用的是add,字典用update或者直接赋值键。用错类型报AttributeError,很快就能看出来。

一句话取舍:单个加用append,整批摊平用extend,循环里要拼一大坨先建空列表再append,别用加号。