forループで未使用の変数を宣言する方法を教えてください。


87

私がこのようなリスト内包表記を持っている場合(たとえば):

['' for x in myList]

リスト内のすべての要素に対して空の文字列を持つ新しいリストを効果的に作成するために、私は決して使用しませんx。未使用のx変数を宣言する必要がないように、これを書くためのよりクリーンな方法はありますか?

回答:


130

_ forループとタプルの割り当てで無視されるメンバーの標準のプレースホルダー名です。

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

ところで、リストはリスト内包表記なしで記述できます(文字列、整数などの不変のメンバーのリストを作成したい場合)。

[''] * len(myList)

10
後者には、可変オブジェクトに対して期待されることを行わないという大きな警告が伴う必要があります。

5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm 2011年

@Ramy:Mohitが説明を投稿しましたが、削除されました:Sとにかく、docs.python.org / py3k / library /のNotes2を確認してください
kennytm 2011年

2
@ Ramy、Pythonはメモリ内の同じオブジェクトに対して同じ参照を維持します。
モヒットランカ2011年

forたとえば、ネストされたループを実行しているかどうかは重要ですか?またはfor _ in range(...)私が言いたい内部の場合は_, var = f(x)?2つの_変数の間で混乱しますか?
Eric Auld 2018

19

いいえ。禅が言うように、特別な場合は規則を破るほど特別ではありません。特殊なケースは、繰り返されるもののアイテムを使用しないループであり、ルールは、解凍する「ターゲット」があるということです。

ただし、_変数名として使用することはできます。これは通常、「意図的に使用されていない」と理解されます(PyLintなどでもこれを認識して尊重します)。


ただし、PyLintは、にC: 10,24: Invalid variable name "_" (invalid-name)追加しない限り、不平を言いgood-namesます.pylintrc
giorgiosironi 2016年

12

dummy*変数名として(開始語はダミー)を使用すると、と同じトリックが実行されることがわかります__は既知の標準であり、意味のある変数名を使用することをお勧めします。あなたが使用することができますのでdummydummy1dummy_anything。これらの変数名PyLintを使用しても文句はありません。


私は確かにこのアプローチを好みます。それは意味のあるままです。
rvdK 2018


1

引数に名前を付ける必要がある場合(たとえば、名前で参照される特定の引数を使用しないモックを作成する場合)、次のショートカットメソッドを追加できます。

def UnusedArgument(_):
  pass

そして、このように使用します

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

0

ジェネレータオブジェクトは実際には変数を使用しません。だから何かのような

list(('' for x in myList))

トリックを行う必要があります。xは、ジェネレーターの理解の範囲外の変数として定義されていないことに注意してください。


0

_変数に人間が読める名前を付ける場合は、変数名の前に付けることもできます。たとえば、あなたが使用することができ_foo_foo1_anythingおよびPyLintは文句を言うことはありません。forループでは、次のようになります。

for _something in range(10):
    do_something_else()

編集:例を追加


0

冗長な方法は次のとおりです。

newList = []
while len(newList) < len(mylist):
    newList.append('')

この方法で使用変数を宣言することは避けてください。

また、可変オブジェクトと不変オブジェクト(辞書など)の両方をに追加できますnewList

私のようなPython初心者にとってのもう一つのこと、「_」、「ダミー」は少し当惑しています。



-1

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はどちらも、同じメモリ位置を指します。言い換えると、可変変数は、不変変数の場合のように、変数が指す値のコピーを作成するのではなく、変数が指す同じメモリ位置で動作します。


これに感謝しますが、それが質問と何の関係があるのか​​本当にわかりません。(いいえ、私は反対票を投じませんでした)
ラミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.