私がこのようなリスト内包表記を持っている場合(たとえば):
['' for x in myList]
リスト内のすべての要素に対して空の文字列を持つ新しいリストを効果的に作成するために、私は決して使用しませんx
。未使用のx
変数を宣言する必要がないように、これを書くためのよりクリーンな方法はありますか?
回答:
_
forループとタプルの割り当てで無視されるメンバーの標準のプレースホルダー名です。
['' for _ in myList]
[a+d for a, _, _, d, _ in fiveTuples]
ところで、リストはリスト内包表記なしで記述できます(文字列、整数などの不変のメンバーのリストを作成したい場合)。
[''] * len(myList)
a=[[]]*4;a[0].append(5);print(a)
for
たとえば、ネストされたループを実行しているかどうかは重要ですか?またはfor _ in range(...)
私が言いたい内部の場合は_, var = f(x)
?2つの_
変数の間で混乱しますか?
いいえ。禅が言うように、特別な場合は規則を破るほど特別ではありません。特殊なケースは、繰り返されるもののアイテムを使用しないループであり、ルールは、解凍する「ターゲット」があるということです。
ただし、_
変数名として使用することはできます。これは通常、「意図的に使用されていない」と理解されます(PyLintなどでもこれを認識して尊重します)。
C: 10,24: Invalid variable name "_" (invalid-name)
追加しない限り、不平を言いgood-names
ます.pylintrc
。
同じ行のforループの後に次のコメントを追加します。
#pylint:disable = unused-variable
for i in range(100): #pylint: disable=unused-variable
ジェネレータオブジェクトは実際には変数を使用しません。だから何かのような
list(('' for x in myList))
トリックを行う必要があります。xは、ジェネレーターの理解の範囲外の変数として定義されていないことに注意してください。
冗長な方法は次のとおりです。
newList = []
while len(newList) < len(mylist):
newList.append('')
この方法で使用変数を宣言することは避けてください。
また、可変オブジェクトと不変オブジェクト(辞書など)の両方をに追加できますnewList
。
私のようなPython初心者にとってのもう一つのこと、「_」、「ダミー」は少し当惑しています。
forループで未使用の変数を宣言する方法を教えてください。(コメントサイズがなくなりました)
Pythonは、作成されたオブジェクトに対して同じ参照を維持します。(可変性に関係なく)たとえば、
In [1]: i = 1
In [2]: j = 1
In [3]: id(i)
Out[3]: 142671248
In [4]: id(j)
Out[4]: 142671248
iとjの両方がメモリ内の同じオブジェクトを参照していることがわかります.1つの不変変数の値を変更するとどうなりますか?
In [5]: j = j+1
In [6]: id(i)
Out[6]: 142671248
In [7]: id(j)
Out[7]: 142671236
jが新しい場所(2が格納されている場所)を指し始め、iがまだ1が格納されている場所を指していることがわかります。評価中、
j = j+1
値は142671248から選択され、計算され(まだキャッシュされていない場合)、新しい場所142671236に配置されます。jは新しい場所を指すように作成されます。簡単に言うと、不変変数が変更されるたびに新しいコピーが作成されます。
可変オブジェクトは、この点で少し異なります。が指す値が
In [16]: a = []
In [17]: b = a
In [18]: id(a)
Out[18]: 3071546412L
In [19]: id(b)
Out[19]: 3071546412L
aとbの両方が同じメモリ位置を指しています。
In [20]: a.append(5)
aが指すメモリ位置が変更されます。
In [21]: a
Out[21]: [5]
In [22]: b
Out[22]: [5]
In [23]: id(a)
Out[23]: 3071546412L
In [24]: id(b)
Out[24]: 3071546412L
aとbはどちらも、同じメモリ位置を指します。言い換えると、可変変数は、不変変数の場合のように、変数が指す値のコピーを作成するのではなく、変数が指す同じメモリ位置で動作します。