1

これを行うより良い方法はありますか?

a, b, c, = "yyy", "yyy", "yyy"

明らかな試みは失敗します

a, b, c, = "yyy"
a, b, c = "yyy"*3

技術的には、次のように動作しますが、このロジックは a、b、c が同じであると言っているため、直感的ではないと思いますが、私がしようとしているのは、それらが同じ値として初期化されると言うことだけです。

a=b=c="yyy"
4

2 に答える 2

11

ここでタプル代入を使用する必要はありません。右側の値は不変であるため、参照を共有することもできます。

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でくださいbc次にジェネレーター式を使用します。

a, b, c = ({} for _ in range(3))

またはさらに良いことに、それほど怠惰にならず、単にそれらを入力してください:

a, b, c = {}, {}, {}

左側の割り当てが動的であるとは限りません。

于 2013-09-06T16:02:35.580 に答える
5
>>> a, b, c = ("yyy",)*3 

上記の構成は と同等ですa = b = c = "yyy"が、メモリ内にタプルを作成する必要がありa、 、bcは同じオブジェクトへの参照にすぎません。

異なる 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], [], [])
于 2013-09-06T16:00:54.737 に答える