質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

352閲覧

Python関数の引数と代入に関して

leilei

総合スコア39

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/08 04:53

編集2018/07/09 06:01

Q1:
Python関数の引数もstackでしょうか。
例えば、

Python

1def func(x): 2 x=100 3

があるとします。

x=0
func(x)

print(x)
100

になるのでしょうか
Cの場合では無理ですね**。∵ func(x)の中のx=100は元のxに代入されないからです。**
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Q2:
Pythonのobject代入に関して、Obj1とObj2はあるクラスの二つのinstanceとします。

Obj1=Obj2
にすればどうなるのでしょか。
中身のdeep copyを行うのでしょうか、それとも単にアドレスの代入でしょうか。
要は、それ以降obj2の中身が変わった時、obj1からしても変わるのでしょうか。

##どうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/07/08 04:54

とりあえずmarkdownを使ってください。再編集画面でコード部分を選択して、<code>ボタンを押して「ここに言語を入力」を「python」に書き換えるのです
leilei

2018/07/09 06:00

有難うございます! 直しました。
guest

回答2

0

Q1:
動かしてみれば一発でわかる通り、関数の中での代入はローカル変数に代入され、外のxには影響を及ぼしません。
ただし、ローカル変数xを作らない限りは外のスコープ(定義元)から探してきます。
stackだし、基本的には常識的な動作でしょう(それでもたまに変に見えるときがありますが)。

Q2:
Obj1,Obj2が変数名ならば、代入はアドレスの代入です。

python

1>>> a = 1 2>>> b = 2 3>>> id(a) 49169088 5>>> id(b) 69169120 7>>> a = b 8>>> id(a) 99169120 10>>> id(b) 119169120

id(≒アドレス)が9169088のオブジェクト(1)はこの場合、参照されなくなってGCが回収していく、というのが原則。ただし、上に続けてid(1)と打つと、

python

1>>> id(1) 29169088

このような結果が得られると思います。こういう、しょっちゅう使いそうな小さい数字のオブジェクトを、必要になるたびに作り直していたら不経済なことこの上ないので、内部でキャッシュしている訳です。もちろんすべての数で同じ挙動にはなりません。ある程度大きい数はキャッシュされないようです。

python

1>>> a = 1 2>>> id(a) 39169088 4>>> del a 5>>> a = 1 6>>> id(a) 79169088 8>>> a = 1024 9>>> id(a) 10140587587642416 11>>> del a 12>>> a = 1024 13>>> id(a) 14140587610978288

ちょっと話が脱線しましたが、pythonの場合は代入は常に参照を張るだけと思ってまず間違いありません。

例外っぽいのは、

  • 累算代入文

+=などは可能であればin-placeで処理されます。つまり、元のオブジェクトが変わります。

 

  • list[i] =等、添字表記やスライスに代入するもの

これはオブジェクトの__setitem__メソッドで処理されます。だから、変な動作にしようと思えばいくらでも出来ます(普通はそんなことはしないで、常識的な動作になる訳だが)。

投稿2018/07/08 05:34

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leilei

2018/07/09 06:19 編集

原理までご紹介頂き誠にありがとうございます。 >>pythonの場合は代入は常に参照を張るだけと思ってまず間違いありません。 例えば、obj2=obj1 の場合 この後、obj1のメンバーデータが変わったら、 obj2の内容も変わりますね? 要はobj2はobj1のある時点の結果を保存する役割が果たせないということですね。 また宜しくお願い致します。
hayataka2049

2018/07/09 06:24

基本的にはその通りです。 >>> a = [] >>> b = a >>> a.append(1) >>> a [1] >>> b [1]
hayataka2049

2018/07/09 06:25

ただし、こういう挙動もあります >>> a = 1 >>> b = a >>> a += 1 >>> a 2 >>> b 1 この場合、a += 1はa = a + 1と書いたことと同じなので(intがimmutableだから)、こういう結果を招きます
leilei

2018/07/09 06:39

hayataka2049様 ご教授ありがとうございます。 申し訳ございませんが、いったん分かったような気がしましたが、 最後の例でわけが分からなくなりました。 bがaの参照なのに、変数の物理的な本体は一緒と考えていましたが、 どうして内容が異なることになってしまったのでしょうか。 それから、私の目的はobj2で obj1の某時点の中間結果をキープしたいのですが、 どうすれば良いのでしょうか。   (『obj2=obj1』ではだめだと分かりました。)
hayataka2049

2018/07/09 06:53

演算結果を再代入した時点で、物理的に違うオブジェクトへの参照が張られるからです >>> a = 1 >>> id(a) 9169088 >>> a += 1 >>> id(a) 9169120
hayataka2049

2018/07/09 06:54

>中間結果をキープしたい 具体的に何でやりたいのかによります
leilei

2018/07/09 15:36

丁寧なご指導本当にありがとうございます。 >>中間結果をキープしたい >具体的に何でやりたいのかによります あるclassのobject:obj1のある時点に各メンバー変数の内容を保存(copy)し、それ以降のobj1の変動に影響されないようにしたいのです。
hayataka2049

2018/07/09 16:42

copy.deepcopyでとりあえずはできると思います
leilei

2018/07/12 01:45

copy.deepcopy ですか。 C++なら、「=」をカスタマイズして、実現するのでしょうね。 どうもありがとうございました!
guest

0

Pythonの実装が知りたい場合は、公式の言語リファレンスを読むと良いかと思います。

https://docs.python.jp/3/reference/index.html

私も全てを知っているわけではないので、「多分ここ」という話しかできないのですが、
質問に上がっている疑問は、以下の記述を見ると解消されるのではないかと思います。

公式ドキュメント/言語リファレンス/データモデル
https://docs.python.jp/3/reference/datamodel.html

例えば、 a = 1; b = 1 とすると、 a と b は値 1 を持つ同じオブジェクトを参照するときもあるし、そうでないときもあります。これは実装に依存します。

投稿2018/07/08 05:15

mtb_beta

総合スコア181

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leilei

2018/07/09 06:12

貴重なコメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問