Python 3では、を使用*
して、元のタプルから新しい要素の新しいタプルを作成できます。
>>> tuple1 = ("foo", "bar")
>>> tuple2 = (*tuple1, "baz")
>>> tuple2
('foo', 'bar', 'baz')
バイトコードはほぼ同じですtuple1 + ("baz",)
Python 3.7.5 (default, Oct 22 2019, 10:35:10)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
... tuple1 = ("foo", "bar")
... tuple2 = (*tuple1, "baz")
... return tuple2
...
>>> def g():
... tuple1 = ("foo", "bar")
... tuple2 = tuple1 + ("baz",)
... return tuple2
...
>>> from dis import dis
>>> dis(f)
2 0 LOAD_CONST 1 (('foo', 'bar'))
2 STORE_FAST 0 (tuple1)
3 4 LOAD_FAST 0 (tuple1)
6 LOAD_CONST 3 (('baz',))
8 BUILD_TUPLE_UNPACK 2
10 STORE_FAST 1 (tuple2)
4 12 LOAD_FAST 1 (tuple2)
14 RETURN_VALUE
>>> dis(g)
2 0 LOAD_CONST 1 (('foo', 'bar'))
2 STORE_FAST 0 (tuple1)
3 4 LOAD_FAST 0 (tuple1)
6 LOAD_CONST 2 (('baz',))
8 BINARY_ADD
10 STORE_FAST 1 (tuple2)
4 12 LOAD_FAST 1 (tuple2)
14 RETURN_VALUE
唯一の違いはBUILD_TUPLE_UNPACK
vsBINARY_ADD
です。正確なパフォーマンスはPythonインタープリターの実装によって異なりますが、多態的な演算子であるためBUILD_TUPLE_UNPACK
よりも高速に実装するのが自然であり、追加の型計算と暗黙的な変換が必要になります。BINARY_ADD
BINARY_ADD