Reference,unpack,同時代入,変数の削除,3項演算子

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