読者です 読者をやめる 読者になる 読者になる

はてブロ@ama-ch

https://twitter.com/ama_ch

今日のPython

Program Python

スクリプトファイル

やっとファイルだ!


p.115 コマンドラインから与えた引数を表示するargtest.py

#!/usr/bin/env

import sys

print sys.argv

実行する

ama-ch$ python argtest.py 1 2 3
['argtest.py', '1', '2', '3']

コマンドライン引数を受け取るために、sysというモジュールを使う。syaモジュールには「sys.argv」という変数が登録されており、これにはスクリプト自体のファイル名を含むコマンドライン引数の一覧がリストとして格納されている。
つまり、sysモジュールをインポートした時点でsys.argvにファイル名+引数が格納されるのか。

変数とリファレンス

p.121
変数は入れ物ではなく、リファレンスである。Pythonでの変数の役割はラベルのようなもので、代入(=)により対象オブジェクトと変数を結びつける。
[変数]〜(ひも)〜[オブジェクト]というイメージらしい。


実験してみよう

>>> a = 1  #[a]〜[1]
>>> b = a  #[a]〜[1]〜[b]
>>> a, b   #値を確認
(1, 1)
>>> a = 2  #[a]〜[2] [1]〜[b]
>>> a, b
(2, 1)

これは、パッと見[1]〜[a]〜[b]と結びついているように見えるから、a = 2と代入をしたらbも2と表示されそうなとこなんだけど、そうはならない。b = aのときに、「bにaを代入する」のではなくて、「aの結びつくオブジェクトにbも結びつける」ということだと思う。
a = 2をするとaの結びつくオブジェクトが変わるから、(a, b) == (2, 1)のようになった。たぶん!


p.123 もういっこ実験

>>> lista = [1, 2, 3]
>>> listb = lista
>>> lista, listb
([1, 2, 3], [1, 2, 3])
>>> lista.append(100)     #listaに要素を追加
>>> lista, listb          #値を確認
([1, 2, 3, 100], [1, 2, 3, 100])  #両方とも値が変わった
>>> lista = [1, 2, 3, 4]  #listaにリストを代入
>>> lista, listb
([1, 2, 3, 4], [1, 2, 3, 100]) #listaだけ変わった
>>> lista = [1, 2, 3, 100]     #listbと同じ値を代入してみる
>>> lista, listb
([1, 2, 3, 100], [1, 2, 3, 100])
>>> lista.append(777)          #この状態でlistaにオブジェクトを追加すると
>>> lista, listb
([1, 2, 3, 100, 777], [1, 2, 3, 100]) #やっぱlistaしか変わらない

最初listaとlistbは同じオブジェクトを参照していて、append()メソッドはオブジェクトを直接書き換えるから、listaに対してappend()を実行すると、同じオブジェクトを参照しているlistbの値も変わる。
次のlista = [1, 2, 3, 4]は、listaの参照するオブジェクトを変えているから(ラベルを張り替えた)、listaとlistbの参照するオブジェクトは違うものになった。
lista = [1, 2, 3, 100](listbの値)としてからappendしてみても、やっぱりlistbは変わらない。lista = listbと書かないと、値が同じでも違うアドレスを確保するんだろうな。当たり前っちゃ当たり前だね!