忍者ブログ
Yaleで、遊んで学ぶ日々。

Yaleで、遊んで学ぶ日々。

囲碁、ときどきプログラミング、ところにより経済。
[304]  [303]  [302]  [301]  [300]  [299]  [298]  [297]  [296]  [295]  [294
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Pythonを使い始めてしばらく経つが、初めて参照と値の違いによるバグが生じた。次のA-Cの結果はそれぞれどうなるだろうか。

# (A)
x = []
s = ""
for i in range(5):
    s = "a" + str(i)
    x.append(s)
print x

# (B)
x = []
s = [""]
for i in range(5):
    s = [ "a" + str(i) ]
    x.append(s)
print x
 
# (C)
x = []
s = [""]
for i in range(5):
    s[0] = "a" + str(i)
    x.append(s)
print x


答えは、
(A): ['a0', 'a1', 'a2', 'a3', 'a4']
(B): [['a0'], ['a1'], ['a2'], ['a3'], ['a4']]
(C): [['a4'], ['a4'], ['a4'], ['a4'], ['a4']]
 
(C) については、xの各要素がすべて同じsを参照しているため、sの値を変えるたびにそれがxに反映されてしまう。
一方(B)では、forループ内で毎回sを定義しなおしているので、xの各要素はそれぞれ異なるモノを参照している。


他にも色々試してみる。

次のコードの場合、xへの変更はyに反映されない。
x = [["a"], ["b"], ["c"]]
y = [[""], [""] , [""]]
for i in range(3):
    y[i] = x[i]
print "x", x, "y", y
 
x[0] = ["d"]
print "x", x, "y", y
 

この場合も、反映されない。
x = [["a"], ["b"], ["c"]]
y = x[0]
print "x", x, "y", y
 
x[0] = ["d"]
print "x", x, "y", y


ということは、y = x という形の場合は参照になるが、y = x[j] という形の場合は値の代入になるのかな。あるいは、x[j]と書いた瞬間にその要素の複製を作っているので、これはx本体とは区別されるということだろうか。

PR
この記事にコメントする
お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Calender
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Oldest Posts
Latest Trackbacks
フリーエリア

Barcode
Access Analysis
Powerd by NINJAブログ / Designed by SUSH
Copyright © Yaleで、遊んで学ぶ日々。 All Rights Reserved.
忍者ブログ [PR]