我怀疑这可能是个意外,尽管我更喜欢这种新的行为。
这种新的行为是字节码的使用方式发生变化的结果
*
争论是有效的。变化就在眼前
changelog
在Python3.9下。0阿尔法3:
bpo-39320
在Python3.7(我没有现成的3.8可供测试)上
f(*a, a.pop())
1 0 LOAD_NAME 0 (f)
2 LOAD_NAME 1 (a)
4 LOAD_NAME 1 (a)
6 LOAD_METHOD 2 (pop)
8 CALL_METHOD 0
10 BUILD_TUPLE 1
12 BUILD_TUPLE_UNPACK_WITH_CALL 2
14 CALL_FUNCTION_EX 0
16 RETURN_VALUE
1 0 LOAD_NAME 0 (f)
2 BUILD_LIST 0
4 LOAD_NAME 1 (a)
6 LIST_EXTEND 1
8 LOAD_NAME 1 (a)
10 LOAD_METHOD 2 (pop)
12 CALL_METHOD 0
14 LIST_APPEND 1
16 LIST_TO_TUPLE
18 CALL_FUNCTION_EX 0
20 RETURN_VALUE
a
和
(a.pop(),)
在堆栈上,然后将这两个iterable解压为一个元组。在新的字节码中,代码将列表推送到堆栈上,然后
l.extend(a)
和
l.append(a.pop())
tuple(l)
.
这一变化的影响是改变了产品的包装
到
pop
打电话,但这似乎不是故意的。看着
,其目的是简化字节码指令,而不是更改行为,bpo线程没有讨论行为更改。