えびしブログ

〜サーバーは魔法で動いているわけではない〜

Pythonでリストの深いコピー

Pythonのリストの代入は参照渡しなので、普通に代入すると内容は同じものを指します。

>>> hoge = [1, 2, 3]
>>> fuga = hoge
>>> id(hoge)
4359788304
>>> id(fuga)
4359788304
>>>

参照を渡すだけでなく、複製したい場合は以下のようなやりかたでできます。

>>> hoge = [1, 2, 3]
>>> fuga = list(hoge)  # その1
>>> piyo = hoge[:]  # その2
>>> id(hoge)
4359425992
>>> id(fuga)
4359327896
>>> id(piyo)
4359788304
>>> import copy
>>> moga = copy.copy(hoge)  # その3
>>> id(moga)
4359328544

ただし、リストの中身が辞書のような参照先のあるオブジェクトである場合は、上記の方法でリストのコピーができても、中身の辞書は参照先が渡されるためコピーできません。

>>> hoge = [{"a": 1}]
>>> fuga = list(hoge)
>>> id(hoge[0])
140553539258480
>>> id(fuga[0])
140553539258480

中身もコピーしたい場合はcopyモジュールのdeepcopy関数を利用します。

8.17. copy — 浅いコピーおよび深いコピー操作 — Python 2.7ja1 documentation

>>> hoge = [{"a": 1}]
>>> import copy
>>> fuga = copy.deepcopy(hoge)
>>> id(hoge[0])
140553539161136
>>> id(fuga[0])
140553539260496

こういうコピーを「深いコピー」というそうです。

「ちゃんとリストをコピーしたはずなのに中身の辞書が同じものを指してるっぽい!なんで??」と悩んだことがあったため記録しておきます。

おわり。

rbenvとは、gemとは何か?

はじめに

Chefの勉強をするにあたってruby環境を作ったのですが、 ruby関係のことばでよく聞く

  • rbenv
  • gem

についてちゃんと理解してなかったためぐぐってみました。

rbenvとは?

Rubyのバージョンをかんたんに切り替えてくれるやつ!

ふむふむ。 プロジェクトごとにRubyのバージョンが異なるということはよくありそうなので、簡単に切り替えられるのは便利そうですね。

インストール方法

環境はMac OS X 10.8.5です。 githubからcloneしてきます。

# rbenvをclone
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# PATHの設定
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
# rubyをインストールするためにruby-buildというプラグインが必要らしいのでcloneする
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Homebrewでもインストールできるみたいです。

簡単な使い方です。

# インストール可能なバージョン一覧を表示
rbenv install -l
# バージョン 2.0.0-p353 をインストール
rbenv install 2.0.0-p353
# インストール済み一覧表示
rbenv versions
# インストールしたバージョンに切り替える
# globalを指定するとPC全体のrubyのバージョンが切り替わる
# localを指定するとカレントディレクトリのみ切り替わる
rbenv global 2.0.0-p353
# 現在のバージョン確認
ruby --version

参考

https://github.com/sstephenson/rbenv https://github.com/sstephenson/ruby-build

ちなみに、gccが入っていないとrubyのインストールに失敗してしまいます。 Macの場合、Xcodeコマンドラインツールをインストールするとgccコマンドラインで使えるようになるそうです。

参考

http://kawairi.jp/weblog/vita/201204255985

gemとは?

Rubyサードパーティ製のライブラリの形式のこと

Rubyに付属しているRubyGemsというパッケージングシステムでライブラリの作成・公開・インストールができるらしいです。

ライブラリのインストール方法はよく知られているとおりこんなかんじです。

gem install hoge

参考

https://rubygems.org/

Bundler

gemライブラリの種類やバージョンを管理するのにBundlerというツールを使うとよさそうです。

参考

http://bundler.io/ http://blog.mirakui.com/entry/20100703/1278165723 http://www.rubylife.jp/rails/ini/index2.html

おわりに

Rubyでがりがりプロジェクトを作るとしたらrbenvとかbundlerは必須なのかなーと思いました。 Chefを使いたいというぐらいだったらここまでしなくてもよいかなーと思いましたが、あまりシステムのRuby環境をいじりたくなかったので導入してよかったと思います。

おわり。