Pythonの仕様

の続きです。

数学って面白い!に勝手にコメントする

の1問目で話した、Pythonで変数の型を変更するということについて説明します。

Pythonは変数の型について下の図のようにプログラムの間で変更することができます。



a=str(a) 
bestr(b)#aとbを文字列に変換

a=+" "+b#aにaとc間に半角スペースの文字列を入れます。

b, a = input(a).split()#bにaの半角スペースまでの部分、aに後ろの部分を代入

a=int(a)
b=int(b)#一応int型らしいのでintに変換


ただし、これは新しくメモリを割り当てているので、メモリの上ではaと名付けられた別の変数になります。文字列型と整数型では使用するメモリの量も違いますし、記憶のプロトコルも違います、内部的にはどうなっているのか気になるので調べてみます。

~~調査中~~

Pythonのsys.getsizeof 関数を使って実際にどれくらいのメモリを使っているのか調べてみます。

import sys
a=3
b=6

a=str(a)
b=str(b)

x1=sys.getsizeof(a)
x2=sys.getsizeof(b)

a=a+' '+b

x3=sys.getsizeof(a)

b,a = a.split(' ')

a=int(a)
b=int(b)

x4=sys.getsizeof(a)
x5=sys.getsizeof(b)

print(a)
print(b)

print('3を文字列で記録したときの容量')
print(x1)
print('6を文字列で記録したときの容量')
print(x2)
print('3 6を文字列で記録したときの容量')
print(x3)
print('6を整数で記録したときの容量')
print(x4)
print('3を整数で記録したときの容量')
print(x5)

出力はこうなります、単位はバイトです。

使用しているメモリの量を見てもらえばわかるように、文字列の場合と、整数の場合で必要な量のメモリを使用しているころがわかります。文字列も半角文字1文字なら50バイトで「3 6」と3文字になるとちゃっかり2バイト増やして52バイト使用しているのが面白いです。

これでわかる通り、ソースコード上では2変数に見えますけれども、内部的には整数型4変数分くらいのメモリを使用しているので「設問の不備を突いた」やりかただというわけです。

次回の記事に続きます。