Python Tricks
1. The Self-Replicating Trick 将一个含有空列表的列表乘5, 得到有5个空列表的列表 x = [[]] * 5 x [[], [], [], [], []] 当使用.append("x")方法时, 所有列表都被修改 x[0].append("x") x [[“x”], [“x”], [“x”], [“x”], [“x”]] 打印其 id 可以看到, id 都相同 for item in x: print(id(item)) 4417579584 4417579584 4417579584 4417579584 4417579584 或者使用set()发现 id 唯一 set(id(item) for item in x) {4417579584} 也就是说, 当使用乘法的时候, 创建了5个内部列表的引用副本 使用反汇编发现, 只创建了两个列表, 并执行乘5 dis.dis("[[]] * 5") 0 0 RESUME 0 # 用于支持解释器恢复 (py3.11) 1 2 BUILD_LIST 0 # 构造一个空列表[], 压栈 4 BUILD_LIST 1 # 从栈顶取一个对象, 构造列表[[]] 6 LOAD_CONST 0 (5) # 加载常量 5 8 BINARY_OP 5 (*) # 对栈顶两个元素执行乘法 12 RETURN_VALUE # 返回栈顶结果 The alternative 如果要构造独立列表, 应改用列表推导式 ...