[過去ログ] 【まず1嫁】くだすれPython(超初心者用) その59 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
740
(1): デフォルトの名無しさん [] 2024/06/25(火) 08:47:33.30 ID:PJlEmYUO(1/7) AAS
>>737
737(3): デフォルトの名無しさん [] 2024/06/25(火) 04:20:51.69 ID:dFDrSth2(2/2) AAS
関数の引数がどんな型でも参照渡しとか、アセンブラのサブルーチンよりもひどい設計なんだよなあ
オブジェクトだからどんな型でも参照渡しなんじゃないのか?
もしかして、「参照渡し」という言葉をオレが誤解している?
742
(2): デフォルトの名無しさん [] 2024/06/25(火) 13:25:16.56 ID:PJlEmYUO(2/7) AAS
>>741
741(3): デフォルトの名無しさん [sage] 2024/06/25(火) 09:35:15.76 ID:ZD6OkC9b(1) AAS
>>740
Pythonは(参照の)値渡し
>>737は間違いで>>739が正しい

def modify(x):
 x = None

x = [1, 2, 3]
modify(x)
print(x) #この結果をNoneにできるのが参照渡し
それは引数の渡し方でなく、x = Noneによって xが新たな Noneオブジェクトを指した結果じゃないかな。

$ cat x.py
def modify(xx, yy):
  print('xx', id(xx), xx)
  print('yy', id(yy), yy)

  xx = None  # 代入により別オブジェクトを指す。
  yy.clear() # 変更結果が返される。

  print('xx', id(xx), xx)
  print('yy', id(yy), yy)
x = [1]
y = [11]
print('x', id(x), x)
print('y', id(y), y)
modify(x, y)
print('x', id(x), x)
print('y', id(y), y)

$ python3 x.py
x 140253632444160 [1]
y 140253627941632 [11]
xx 140253632444160 [1]
yy 140253627941632 [11]
xx 140253637855360 None
yy 140253627941632 []
x 140253632444160 [1]
y 140253627941632 []
744
(1): デフォルトの名無しさん [] 2024/06/25(火) 13:28:25.30 ID:PJlEmYUO(3/7) AAS
>>741
で、C言語だとこんな感じかと想像するが、
変数 xの値である 1 を渡すことを、値渡し、
変数 xのポインタである 0x7ffed3b1f5ac を渡すことを、参照渡しと呼んでいた。

$ cat x.c
#include <stdio.h>
void modify(int *xx, int *yy) {
 printf("xx %p %d\n", xx, *xx);
 printf("yy %p %d\n", yy, *yy);
 int new_xx = 0;
 xx = &new_xx; /* 代入により別オブジェクトを指すPython風 */
 *yy = 0; /* 変更結果が返される。 */
 printf("xx %p %d\n", xx, *xx);
 printf("yy %p %d\n", yy, *yy);
 return;
}
int main(void) {
 int x = 1;
 int y = 11;
 modify(&x, &y);
 printf("x %p %d\n", &x, x);
 printf("y %p %d\n", &y, y);
 return 0;
}
$ cc x.c && ./a.out
xx 0x7ffed3b1f5ac 1
yy 0x7ffed3b1f5a8 11
xx 0x7ffed3b1f58c 0
yy 0x7ffed3b1f5a8 0
x 0x7ffed3b1f5ac 1
y 0x7ffed3b1f5a8 0
747
(1): 742 [] 2024/06/25(火) 14:10:18.90 ID:PJlEmYUO(4/7) AAS
>>745
745(1): デフォルトの名無しさん [sage] 2024/06/25(火) 13:30:09.56 ID:ZtCD4zFU(2/5) AAS
>>742
>>741 は出来ないから参照私じゃないって言ってるんだと思うが
君は日本人か?
同じ渡し方の二つの引数の一方が出来て、他方が出来ないので、渡し方の問題じゃないよね、という話をしたよ。

>>746
746(1): デフォルトの名無しさん [] 2024/06/25(火) 13:31:55.40 ID:ZtCD4zFU(3/5) AAS
>>744
>変数 xの値である 1 を渡すことを、値渡し、
>変数 xのポインタである 0x7ffed3b1f5ac を渡すことを、参照渡し

そんな事実は無い
「参照私」が出現したのはC++から
Cには値私とポインタ私しかない
Call by Reference の和訳は、ポインタ渡しでも参照渡しでも良いと思うよ。
751: デフォルトの名無しさん [] 2024/06/25(火) 14:37:32.71 ID:PJlEmYUO(5/7) AAS
>>748,750
748(2): デフォルトの名無しさん [sage] 2024/06/25(火) 14:20:27.21 ID:mddxyJup(2/5) AAS
Cで実装されてるスクリプト言語の引数の渡し方を論じてなんか意味があるのか?
そういうメモリモデルってだけの話だ
C/C++やFortranみたいにマシンコードと密接に関係してるなら別だが
750(3): デフォルトの名無しさん [sage] 2024/06/25(火) 14:25:08.71 ID:mddxyJup(3/5) AAS
こいつが言いたいのは参照渡しってのは明示的にアドレスを渡すのではなく変数を渡すと自動でその参照を渡すようにコンパイルされるような言語ということを言いたいのだろうことは理解できるが
それをスクリプト言語のPythonで論じてもナンセンス
> Cで実装されてるスクリプト言語の引数の渡し方を論じてなんか意味があるのか?

どうなんだろう?
この手の話は、C言語の方が見通しやすかろうと思って添えたが。
意味が見出だせなければ無視して。Python例から等価っぽく想像しただけのものなので。
752
(2): デフォルトの名無しさん [] 2024/06/25(火) 14:49:09.86 ID:PJlEmYUO(6/7) AAS
>>750
> こいつが言いたいのは参照渡しってのは明示的にアドレスを渡すのではなく変数を渡すと自動でその参照を渡すようにコンパイルされるような言語ということを言いたいのだろうことは理解できるが

俺はその一文を理解できない。
シンプルに、
140253632444160 = id(x) の 140253632444160 に、呼び元呼び先ともにアクセスするので、それは「参照渡し」と言うのだと思っていた。
ということだよ。
760
(4): デフォルトの名無しさん [] 2024/06/25(火) 19:08:21.24 ID:PJlEmYUO(7/7) AAS
>>753,755,756,759
753(1): デフォルトの名無しさん [sage] 2024/06/25(火) 14:56:52.16 ID:mddxyJup(4/5) AAS
>>752
CS的にはそれは値渡しだよ
ポインタだろうがそれは全て整数をコピーするのだから
CS的な参照渡しというのはFortranの以下のような仕様のことを指すことが多い

単に引数をそのまま渡してるのに結果が呼び元に返ってくる
外部リンク[html]:www.nag-j.co.jp
755(1): デフォルトの名無しさん [sage] 2024/06/25(火) 16:53:43.01 ID:9x+jYxZG(2/3) AAS
a = ["ab","cd"]
def f(b):
 b.clear()
 b = None
f(a)
print(a)

値渡しの場合(pythonはこっち)
変数aの参照先の箱aに、["ab","cd"]への参照を値として入れる
変数bの参照先の箱bに、変数aの値(["ab","cd"]への参照)を入れる
変数bの参照先の箱bにある値(["ab","cd"]への参照)のclear()メソッドを実行する
変数bの参照先の箱bに、Noneへの参照を値として入れる
変数aの参照先の箱aにある値([]への参照)を表示する

参照渡しの場合
変数aの参照先の箱aに、["ab","cd"]への参照を値として入れる
変数bの参照先を、変数aの参照先の箱aにする
変数bの参照先の箱aにある値(["ab","cd"]への参照)のclear()メソッドを実行する
変数bの参照先の箱aに、Noneへの参照を値として入れる
変数aの参照先の箱aにある値(Noneへの参照)を表示する

c言語の場合も、ポインタの値渡しはあっても、参照渡しは無かった記憶
756(2): デフォルトの名無しさん [sage] 2024/06/25(火) 17:12:56.33 ID:9x+jYxZG(3/3) AAS
void f(int *b) {
 *b = 2;
 b = NULL;
}
void main() {
 int a = 1;
 f(&a);
 printf("%d\n", a);
}
c言語のポインタの値渡し
変数aの参照先の箱aに、1を値として入れる
変数bの参照先の箱bに、変数aのアドレスを値として入れる
変数bの参照先の箱bにある値(変数aのアドレス)の参照先の箱aに2を入れる
変数bの参照先の箱bに、NULLを値として入れる
変数aの参照先の箱aにある値(2)を表示する

void f(int &b) {
 b = 2;
}
void main() {
 int a = 1;
 f(a);
 printf("%d\n", a);
}
c++言語の参照渡し
変数aの参照先の箱aに、1を値として入れる
変数bの参照先を、変数aの参照先の箱aにする
変数bの参照先の箱aに、2を値として入れる
変数aの参照先の箱aにある値(2)を表示する

長文ごめん
CS とは何ぞ?
その CS的な参照渡しにおける「参照」とは整数以外の何なの?

ただ、「参照渡し」とは、サブルーチンへの引数の渡し方でなく、サブルーチンからの引数の返り方を以て、

・結果が呼び元に返ってくる
・呼び出し元の変数も同じように変更されるもの

という性質を言うらしいことが、ボヤっと分かった。
で、参照渡しっぽい事がしたけりゃ、Awkのように配列で授受すれと。

俺は、>>737 と同様に、オブジェクト実体へのポインタや実体のIDの授受を参照渡しと呼ぶのだと思っていたよ。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.160s*