11
30
3
0番地を見よ
1
2
a
リストの先頭から二番目の場所を探す
a[1] = 4
3
0番地を見よ
1
4
a
該当箇所を書き換える
Slide 12
Slide 12 text
12
30
10 0番地
1番地
2番地
a
a = 10
10
10
a
b
b = a
ラベルaの指す内容がbにコピーされる
10
20
a
b
b = 20
その後bを書き換えてもaは影響を受けない
メモリ上に「10」を表現する場所が作られ、
そこにaというラベルを貼る
Slide 13
Slide 13 text
13
30
3
0番地を見よ
0番地を見よ
1
2
a
b = a
aの指す内容がコピーされる
b
b[1] = 4
3
0番地を見よ
0番地を見よ
1
4
a
b
bを通じてリストを修正する
a[1] # => 4
3
0番地を見よ
0番地を見よ
1
4
a
b
この時、aの指す先も書き換わっている
(同じリストを共有しているから)
Slide 14
Slide 14 text
14
30
aとbは同じリストを指す
a = [1, 2, 3]
b = a
3
0番地を見よ
0番地を見よ
1
2
a
b
b = [4, 5, 6]
3
0番地を見よ
5番地を見よ
4
1
2
a
b
5
6
bにリストを代入
メモリ上に[4, 5, 6]が作られ、
bはそこを指す
aとbは別のリストになる
Slide 15
Slide 15 text
15
30
1
a 1
1
a
関数内のa
def func(a):
a = 2
a = 1
func(a)
1
2
a
関数内のa
aの値がコピーされて渡されてくる
関数内のaが修正されても
元のaは影響を受けない
グローバル変数aが
作られる
関数内のローカル
変数aが作られる
ローカル変数の値
が更新される
このような情報の渡し方を「値渡し」と呼ぶ
20
30
[新しいリストの要素 for 元のリストの要素 in 元のリスト]
リスト内包表記は「後ろから」読む
[2*i for i in source]
(1)
(2)
(3)
(1) sourceというリストに含まれる(in source)
(2) それぞれの要素 i について(for i)
(3) 2*iを要素とするような新しいリストを作ってください
Slide 21
Slide 21 text
21
30
あるリストの要素をすべて二倍したい
source = [0, 1, 2]
result = [2*i for i in source]
「元のリスト」に直接リストを突っ込んでも良い
result = [2*i for i in [0, 1, 2]]
rangeを使うこともできる
result = [2*i for i in range(3)]
※ リスト内包表記は「Pythonらしい」書き方だが、使いすぎに注意