Reference
変数はオブジェクトの参照。ということなので、オブジェクトのidを確認してみる。
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]
代入したときにどうなるか。新しい箱が作られてそちらを指すようになる。
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の各要素が代入される。
数が合わないとエラー。
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の評価においてリストも分解される。
c1,[c2,c3],c4 = [1,[2,3],4]
print(c1) # 1
print(c2) # 2
print(c3) # 3
print(c4) # 4
リストでなくても同時代入は可能。
d1,d2 = 100,200
print(d1) # 100
print(d2) # 200
左辺と右辺の個数が合わないケース。通常は下記の通りエラーになる。
ただし左辺に*があるとよしなにやってくれる。
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
オブジェクトの削除
オブジェクトは明示的に削除できる。
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)。
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