💬

Julia 解釈覚書 2021.03.17

2021/03/17に公開
5

覚書

Julia 1.5.3での動作です。自分が書いているコードで躓いて調べているので、脈絡はありません…。

関数の後につくエクスクラメーションマーク(!)

動作の解釈

破壊的処理を示しています。
push!(List, value)なら、Listにvalueを入れたものをListとして返す。新たなリストは作らず、元の値を変更します。
pythonのin_place=True的なもの。
pythonをやりはじめたときに、破壊処理には苦労させられたので、Juliaで分かれているのはうれしいところです。
非明示的に破壊処理がされる関数などがあるかも要チェックポイントかと思っています。

(Juliaはリストじゃないよ、という話は置いておいてください、コメントありがとうございます)

struct{T}

{T}?

私は公式docにすこし茶目っ気を感じていますが、こことても茶目っ気たっぷりでした。

This declaration defines a new parametric type, Point{T}, holding two "coordinates" of type T. What, one may ask, is T?

Tタイプはどんなタイプでも、という意味のようです。

it can be any type at all (or a value of any bits type, actually, although here it's clearly used as a type).

以下、不明情報なので斜線

リストのスライス

動作の解釈

両方1より小さいインデックスだと、その分だけ0埋めしたリストが返ります。

バグるんじゃないか?と思って確かめたときに発見したので、doc等で見つけたということはありません。

a = [1,2,3]
a[1:0] # Int64[]
a[-1:0] # [0,0]

Discussion

antimon2antimon2

Juliaの1次元配列はリストじゃない(データ構造的に)、というのはこの際置いといて。

両方1より小さいインデックスだと、その分だけ0埋めしたリストが返る。

そんな仕様あったっけ?と思って手元で動作確認したらやっぱりエラーになりました(Julia v1.5.3/v1.5.4/v1.6.0-rc2 で確認)。

julia> a = [1, 2, 3];

julia> a[-1:0]
ERROR: BoundsError: attempt to access 3-element Array{Int64,1} at index [-1:0]
Stacktrace:《略》

一体どんなコードを実行して a[-1:0] # [0, 0] になったのでしょう?

mk83mk83

紛らわしい名前をつかっていてすみません。

私の環境だと、ご提示のコードでエラーが発生しません。
aはArray{Int64}タイプです。

mk83mk83

エラー再現しました!
PyCharmの実行モードとデバックモードで、デバックモードで実行したらご指摘のエラーが再現されました。上記コードでエラーが発生しなかったのは実行モードです。

antimon2antimon2

PyCharm使ってないのですが「実行モード」とは?

Juliaの配列のインデックスは1始まりで、原則として0も負数も認めない(わざわざ0以下のインデックスが有効になるように再定義した特殊な状況でない限り)(ただし a[1:0] は範囲の開始位置がインデックス範囲内だからOK)なのです、だからエラーが出ない方がおかしいです、「PyCharmの実行モード」とやらがJuliaにそういう勝手な拡張をしているのでしょうかね?でもそれを標準の配列に対してやってるとしたら無茶苦茶危険だと思います😖

mk83mk83

原因は不明なのですが、結論としてはPyCharmとJuliaの組み合わせは使用しないほうが賢明そうです。
以下、PyCharmの実行モードでの結果です。もちろんふつうはエラーです。

a = [1,2,3,4,5]
println(a[-5:1]) # [559108, 5, 5, 0, 0, 0, 1]

おそらく、PyCharmが何かをしてしまっているのだと思います。
PyCharmには実行とデバックの2種類の実行方法があり、その実行というモードです。両方ともjuliaへのパスは同じなので違いはないはず、なのですが。

PyCharmでもデバックモードに入るとJuliaのREPLが起動し、おなじみのJuliaのロゴが出てくる画面に遷移して上記コードはエラーとなります。

いずれ気づいたことだとは思いますが、勉強段階で気づけてよかったです。ありがとうございます。