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

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

高洛峰
高洛峰オリジナル
2016-10-18 09:58:27972ブラウズ

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

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

例:

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

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

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

1

alist[0][0]=1

そして、必要な結果は次のようになります。 :

1

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

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

1

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

何が起こっているのでしょうか? なぜ A21 に値が割り当てられ、それに応じて他の 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]]

このようにして、上記の代入操作を試すことができます:

>>> blist[0][0]=1
>>> blist
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>>


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