ホームページ  >  記事  >  バックエンド開発  >  Python の *duplicate 文字 (演算子) に注意してください

Python の *duplicate 文字 (演算子) に注意してください

大家讲道理
大家讲道理オリジナル
2016-11-07 17:21:231315ブラウズ

Pythonには特殊な記号「*」があり、数値演算の乗算演算子やオブジェクトの繰り返し演算子として使用できます。ただし、繰り返し演算子として使用する場合は注意が必要です

: ※繰り返される各オブジェクトは同じIDを持ち、メモリ内の同じアドレスを指していることになります。各オブジェクトを操作する際には注意が必要です。

例:

>>> alist = [range(3)]*4
>>> alist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

上記は行列をシミュレートするために 2 レベルのリストを初期化します。説明の便宜上、行列はここでは A として表されます。

ここで、次のコードを使用して、A11 に 1 の値を代入したいとします:

alist[0][0]=1

すると、必要な結果は次のようになります:

[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

しかし、残念ながら、得られる結果は次のとおりです:

[[1 , 1, 2], [1, 1, 2], [1, 1, 2], [1, 1, 2]]

何が起こっているのでしょうか? なぜ他の Ai1 に値が割り当てられているのでしょうか?変化したこと?

その理由は次のとおりです:

記事の冒頭ですでに述べました。 * 繰り返される各オブジェクトは同じ ID を持ちます。つまり、各オブジェクトを操作するときは注意が必要です。 。

初期化時に繰り返し演算子「*」を使用しました。この演算子がオブジェクトに対して繰り返し操作を実行すると、すべての繰り返しオブジェクトは同じメモリアドレスを指すようになります。そのため、いずれかの値を変更すると、

他の値も自然に変更されます。 Python での説明は次のコマンドと出力です:

>>> id(alist[0])
18858192
>>> id(alist[1])
18858192
>>> id(alist[2])
18858192
>>> id(alist[3])
18858192
>>>

ご覧のとおり、ID はすべて同じです。これは、これら 4 つのリストが同じ「リスト」であることを意味します。

この場合、行列をシミュレートしたい場合はどうすればよいでしょうか? もちろん、特別な numpy パッケージに加えて、新しいリストを 1 つずつ上のリストに追加することもできます。このようにして、もう一度試してみましょう 上記の代入操作:

>>> blist=[]
>>> for i in range(4):
    blist.append([j for j in range(3)])
>>> blist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。