目次
プログラミング教育者。ScratchやPythonを教えています。
工作HardwareHubからのお知らせ
リファレンス共有
Rubyなどと同様に、代入ステートメントではオブジェクトは生成されずにリファレンスがコピーされるだけです。
そのため、ある変数に格納されているリファレンスを用いてオブジェクトの値を変更すると、別の変数に格納されているリファレンスから参照したときにも値が変更されていることになります。
sample.py
L1 = [1,2]
L2 = L1
L1 += [3,4]
print L2
出力例
$ python sample.py
[1, 2, 3, 4]
これを回避するためには、新たなオブジェクトが生成されるように工夫する必要があります。
sample.py
L1 = [1,2]
L2 = L1
L1 = L1 + [3,4] # 新たなオブジェクトを生成し、そのリファレンスを代入
print L2
出力例
$ python sample.py
[1, 2]
関数の引数で生じる同様の現象
下記の例では、リスト mylist の内容は上書きされ myval の内容は保持されたままです。
この挙動はC言語などの配列 (ポインタ相当)、あるいはPerlの無名配列と同じです。
sample.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
def func(myval,L):
L[0] = myval
myval = 1024
myval = 512
mylist = [128,256];
func(myval, mylist)
print myval, mylist
出力例
$ python sample.py
512 [512, 256]
スライシングを使用してコピーを生成するなどして回避できます。
sample.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
def func(myval,L):
L[0] = myval
myval = 1024
myval = 512
mylist = [128,256];
func(myval,mylist[:])
print myval, mylist
出力例
$ python sample.py
512 [128, 256]
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Python コードスニペット (条件分岐)if-elif-else sample.py #!/usr/bin/python # -*- coding: utf-8 -*- # コメント内であっても、ASCII外の文字が含まれる場合はエンコーディング情報が必須 x = 1 # 一行スタイル if x==0: print 'a' # 参考: and,or,notが使用可能 (&&,||はエラー) elif x==1: p...
- Python コードスニペット (リスト、タプル、ディクショナリ)リスト range 「0から10まで」といった範囲をリスト形式で生成します。 sample.py print range(10) # for(int i=0; i<10; ++i) ← C言語などのfor文と比較 print range(5,10) # for(int i=5; i<10; ++i) print range(5,10,2) # for(int i=5; i<10;...
- ZeroMQ (zmq) の Python サンプルコードZeroMQ を Python から利用する場合のサンプルコードを記載します。 Fixing the World To fix the world, we needed to do two things. One, to solve the general problem of "how to connect any code to any code, anywhere". Two, to wra...
- Matplotlib/SciPy/pandas/NumPy サンプルコードPython で数学的なことを試すときに利用される Matplotlib/SciPy/pandas/NumPy についてサンプルコードを記載します。 Matplotlib SciPy pandas [NumPy](https://www.numpy
- pytest の基本的な使い方pytest の基本的な使い方を記載します。 適宜参照するための公式ドキュメントページ Full pytest documentation API Reference インストール 適当なパッケージ