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

大家讲道理
リリース: 2016-11-07 17:21:23
オリジナル
1274 人が閲覧しました

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]]
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!