Reference
変数はオブジェクトの参照。ということなので、オブジェクトのidを確認してみる。
1 2 3 4 5 6 7 8 9 10 11 12 |
hoge = [1,2,3,4] fuga = hoge print(hoge) # [1,2,3,4] print(fuga) # [1,2,3,4] print(id(hoge)) # 4359573320 print(id(fuga)) # 4359573320 hoge.append(5) print(hoge) # [1,2,3,4,5] print(fuga) # [1,2,3,4,5] |
代入したときにどうなるか。新しい箱が作られてそちらを指すようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
foo = 1 bar = foo print(foo) # 1 print(bar) # 1 print(id(foo)) # 4359573320 print(id(bar)) # 4359573320 foo = 2 print(foo) # 2 print(bar) # 1 print(id(foo)) # 4476302432 print(id(bar)) # 4359573320 |
Unpack,同時代入
代入の右辺にiterableを置き、左辺に複数の変数を置くと、
左辺の各変数にiterableの各要素が代入される。
数が合わないとエラー。
1 2 3 4 5 6 7 |
foo = [1,2,3,4,5] a1,a2,a3,a4,a5 = foo print(a1) # 1 print(a2) # 2 print(a3) # 3 print(a4) # 4 print(a5) # 5 |
左辺にリストを置けるが、Unpackの評価においてリストも分解される。
1 2 3 4 5 |
c1,[c2,c3],c4 = [1,[2,3],4] print(c1) # 1 print(c2) # 2 print(c3) # 3 print(c4) # 4 |
リストでなくても同時代入は可能。
1 2 3 |
d1,d2 = 100,200 print(d1) # 100 print(d2) # 200 |
左辺と右辺の個数が合わないケース。通常は下記の通りエラーになる。
ただし左辺に*があるとよしなにやってくれる。
1 2 3 4 5 6 7 8 |
bar = [1,2,3] b1,b2 = bar # ValueError: too many values to unpack (expected 2) e1,*e2 = bar print(e1) # 1 print(e2) # [2,3] *f1,f2 = bar print(f1) # [1,2] print(f2) # 3 |
オブジェクトの削除
オブジェクトは明示的に削除できる。
1 2 3 4 |
foobar = 1024 print(id(foobar)) # 4348092368 del(foobar) print(id(foobar)) # NameError: name 'foobar' is not defined |
3項演算子
?ではなくif..elseで書く。 a if b else c の場合、bが真ならa,偽ならc。
片方だけ評価される(short circuit)。
1 2 3 4 5 6 7 8 |
a = 100 b = 200 y = True x = a if y else b z = a if not y else b print(x) # 100 print(z) # 200 |