たまに代入について浅いコピー(shallow copy)というのを見て違和感を覚えたのですが、
シャローコピーというのは言語により違いがあったり、定義は不明確なものなのでしょうか。
特に困ってるわけではないのですが、見るたびにモヤモヤするので、ハッキリできるなら解消したいと思っています。
(2020/02/14 追記)
回答、参照ありがとうございました。
いったんクローズいたしますが、何か意見などあれば回答していただけたらコメントいたしますので追加回答歓迎です。
■反省点
代入について固定概念(前提?)があって、そこを表現し忘れたのがあり。
単純に代入演算子だけでは、答えられないことに気づいたのですが、訂正すると既回答が無駄になってしまうので、そのままにしました。
javaでも
java
1Object obj1 = otherObj; 2Object obj2 = otherObj.clone();
で、挙動が違いますもんね・・・(代入を前者の使い方固定で考えてました)
pythonは、右辺が変数でも左辺の記述で挙動が違うのは面白い知見でした。(hayataka2049さん ありがとうございます)
(2020/02/14 ここまで)
■聞きたいこと
代入をシャローコピーというのか?
そのプログラミング言語は何か?
シャローコピーという根拠のようなものがあれば教えてもらいたい
■調べたこと
・wiki:https://en.wikipedia.org/wiki/Object_copying
浅いコピーと深いコピーの用語は、Smalltalk -80にまでさかのぼります。
・Smalltalk-80と思われる当該箇所
6 Protocol for all Objects
Copying Objects
代入の場合、originalとshallow copyが同じものを指していると思われるため、コピーと違うのでは?と思っています。
当該箇所でも a==b
は、falseとなっています。
・掲示板
No, shallow copy is not the same as assignment in Smalltalk.
■その他
javaでの代入とシャローコピーの違いだと、私が考えているもののサンプルです。
java
1 public static void main(String[] args) { 2 3 System.out.println("代入"); 4 int[][] a = {{0,0,0}, {1,1,1}}; 5 int[][] ac = a; // 代入(assignment) 6 System.out.println("a == ac : " + (a == ac)); // コピー元、先は同じオブジェクト 7 ac[0][0] = 3; // 参照先を変更 8 System.out.println("a equal ac " + Arrays.equals(a, ac)); 9 ac[1] = new int[] {2}; // 参照先を変更 10 System.out.println("a equal ac " + Arrays.equals(a, ac)); 11 12 System.out.println(); 13 System.out.println("シャローコピー"); 14 15 a = new int[][] {{0,0,0}, {1,1,1}}; 16 int[][] aSc = new int[2][]; 17 System.arraycopy(a, 0, aSc, 0, 2); // 浅いコピー 18 System.out.println("a == aSc : " + (a == aSc)); // コピー元、先は異なるオブジェクト 19 20 aSc[0][0] = 4; // 参照先を変更 21 System.out.println("a equal aSc " + Arrays.equals(a, aSc)); // true 22 aSc[1] = new int[] {2}; // 参照先を変更 23 System.out.println("a equal aSc " + Arrays.equals(a, aSc)); // false 24 }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/06 04:40
2020/02/06 04:49
2020/02/06 04:57
2020/02/06 05:08
2020/02/06 05:22
2020/02/06 06:58
2020/02/13 00:02 編集
2020/02/13 00:17
2020/02/13 00:19
2020/02/13 00:22
2020/02/13 00:29
2020/02/13 00:32
2020/02/13 00:34
2020/02/13 00:40
2020/02/13 00:44
2020/02/13 00:45
2020/02/13 00:58
2020/02/13 01:01
2020/02/13 01:02
2020/02/13 01:06
2020/02/13 01:09 編集
2020/02/13 01:09
2020/02/13 01:19
2020/02/13 01:21
2020/02/13 01:23
2020/02/13 01:25
2020/02/13 01:26
2020/02/13 01:28
2020/02/13 01:31
2020/02/13 01:39
2020/02/13 01:46 編集
2020/02/13 01:57
2020/02/13 02:04
2020/02/13 02:06 編集
2020/02/13 02:35
2020/02/13 02:42
2020/02/13 03:03 編集
2020/02/13 03:05
2020/02/13 03:27
2020/02/13 03:35
2020/02/13 03:47
2020/02/13 03:51
2020/02/13 03:52
2020/02/13 04:00