これを行うより良い方法はありますか?
a, b, c, = "yyy", "yyy", "yyy"
明らかな試みは失敗します
a, b, c, = "yyy"
a, b, c = "yyy"*3
技術的には、次のように動作しますが、このロジックは a、b、c が同じであると言っているため、直感的ではないと思いますが、私がしようとしているのは、それらが同じ値として初期化されると言うことだけです。
a=b=c="yyy"
これを行うより良い方法はありますか?
a, b, c, = "yyy", "yyy", "yyy"
明らかな試みは失敗します
a, b, c, = "yyy"
a, b, c = "yyy"*3
技術的には、次のように動作しますが、このロジックは a、b、c が同じであると言っているため、直感的ではないと思いますが、私がしようとしているのは、それらが同じ値として初期化されると言うことだけです。
a=b=c="yyy"
ここでタプル代入を使用する必要はありません。右側の値は不変であるため、参照を共有することもできます。
a = b = c = 'yyy'
私の見解では、これはまったく直感的ではありません。Python コンパイラは、バイトコードで 1 つの定数を格納するだけで済みますが、タプル代入を使用するには追加のタプル定数が必要です。
>>> def foo():
... a, b, c = 'yyy', 'yyy', 'yyy'
...
>>> foo.__code__.co_consts
(None, 'yyy', ('yyy', 'yyy', 'yyy'))
>>> def bar():
... a = b = c = 'yyy'
...
>>> bar.__code__.co_consts
(None, 'yyy')
右側の式が変更可能で、独立したオブジェクトが必要な場合は、これを使用しないa
でくださいb
。c
次にジェネレーター式を使用します。
a, b, c = ({} for _ in range(3))
またはさらに良いことに、それほど怠惰にならず、単にそれらを入力してください:
a, b, c = {}, {}, {}
左側の割り当てが動的であるとは限りません。
>>> a, b, c = ("yyy",)*3
上記の構成は と同等ですa = b = c = "yyy"
が、メモリ内にタプルを作成する必要がありa
、 、b
、c
は同じオブジェクトへの参照にすぎません。
異なる ID の使用:
a, b, c = ("yyy" for _ in xrange(3))
文字列は不変であるため、これは問題になりませんが、可変オブジェクトの場合は異なるタイプの割り当てです。
>>> a = b = c = [] #all of them are references to the same object
>>> a is b
True
>>> a.append(1) #Modifying one of them in-place affects others as well
>>> a, b, c
([1], [1], [1])
>>> a, b, c, = ([],)*3 #same as a = b = c = []
>>> a is b
True
#Here a, b, c point to different objects
>>> a, b, c, = ([] for _ in xrange(3))
>>> a is b
False
>>> a.append(1)
>>> a, b, c
([1], [], [])