ご質問ありがとうございます😊 ① これについては、動画で説明すべきことでしたね... すみません😵 y = x じゃなくて、y = x.copy() って書くと、新しくオブジェクトが作成できるので、copy()を使ってみてください! ② 5:00からの関数の処理ですが、引数の t は、はじめは x と結びついています。しかし t = t + 999 が実行されると、tの値が変わっているので 左辺の t は 新しい別のオブジェクトになります(xと結びついていない)。0:54からのコードを見返してもらうと、理解ができると思います!
最初に知っておいてよかった…!
すごく痒いところに手が届くチャンネルですね!✨チャンネル登録しました!!!!😆
モジュールの使い方だけググって開発進めるだけじゃ
こんなこと知らないままで知識が付いちゃうだろうから、
もしかするといつかはこれのせいでエラーが出て手詰まりになってたかもしれない…
今Pythonの勉強始めて1ヶ月経たないくらいで、本業のほうの業務効率化のため
Seleniumで社内Webを自動巡回して情報を取ってくるプログラム組んでます!
Python楽しい😆
チャンネル登録ありがとうございます!!!
ミュータブル・イミュータブルの動画は、私もすごく気に入っている動画なので、そう言っていただけて嬉しいです😊 Pythonは簡単に書ける言語ではあるんですが、思わぬ落とし穴もあるので、それに気付けてもらえたらと思ってこの動画を出しました!
お仕事でもPythonを使われているんですね😊 お仕事、頑張ってください!
Wow, you've explained what I need to know so nicely!!
Thank you for watching!! :)
独学でC++を10年ほどやったのちPythonを始めたものです.
ずっとPythonの引数は参照渡しと値渡しの2種類あって,配列などサイズが大きくなることが予想されるオブジェクトは自動で参照渡しになるというように解釈しておりました.
この動画をみてミュータブルという概念を知り,誤解に気づくことできました.
大変勉強になります.ありがとうございました.
いつも分かりやすい説明ありがとうございます。
イミュータブルとミュータブルについては理解できました。2点質問があります。
①ミュータブルなリストを3:15あたりで解説していましたが、xもyも書き換わってしまいました。yに代入はしたいけど、xを書き換えたくない場合はどうすればいいでしょうか。
②5:00あたりの「関数の場合」で質問です。
リストの x、y がともに [1,2,3,999] になるのは理解できるのですが、「pythonの関数の引数は値を渡しているのではなく参照を渡している。ミュータブルもイミュータブルも同じ」ならば、intを引数に渡した x=1,y=1000もx、yもともに1000になる気がしてしまうのですが。。
すみません、理解が悪く恐縮ですが、教えていただければ幸いです。
ご質問ありがとうございます😊
① これについては、動画で説明すべきことでしたね... すみません😵 y = x じゃなくて、y = x.copy() って書くと、新しくオブジェクトが作成できるので、copy()を使ってみてください!
② 5:00からの関数の処理ですが、引数の t は、はじめは x と結びついています。しかし t = t + 999 が実行されると、tの値が変わっているので 左辺の t は 新しい別のオブジェクトになります(xと結びついていない)。0:54からのコードを見返してもらうと、理解ができると思います!
なるほど①はcopy()を使えばいんでふね!
②もt=t+999とすることで、xとyでid が異なってるから、xは元のままの値を保持できてるのですね!
ほんとなるほどです!ありがとうございました✨
いつもわかりやすい動画を挙げていただいてありがとうございます。
また、先日はプログラミングのモチベーションアップのコツのアドバイスをいただき、ありがとうございました。
(どこの動画でいただいたのかわからなくなってしまった💦)
あれから、作りたいものを作れるように再度Pythonの勉強を開始しました。
質問があります。
クラス型は引数によって戻り値が変わるので、ミュータブルになるという理解でよろしいのでしょうか。
クラス型というのは「自分で作ったクラス」ということですよね?
自作クラスがミュータブルかイミュータブルかはそのクラスがどのようにデータを扱うかによって違うので「自作クラスは〇〇です」と一律で定めることはできないんですよね!
@@pythonvtuber9917
そうなんですか!!
判別、難しいですね💦
わかりやすくてびっくりした…
びっくりしてもらえて嬉しいです!!!
初コメントです。
この性質(ミュータブル・イミュータブル)が、Pythonを理解する上で特に勉強になりましたのでこちらにコメント失礼します。
サプーさんの動画や書籍も購入させていただきPythonを勉強している者です。
いつも分かりやすい解説ありがとうございます。
おかげさまでid関数(type関数も)を実行する機会が増えました。
最後に私事ですが、1つの節目としてPython3エンジニア認定基礎試験に合格できました。
試験合格が目的ではないのでPythonはこれからも勉強ですね。
ありがとうございます!
Python3エンジニア認定基礎試験の合格おめでとうございます🎉🎉 私も嬉しいです☺️ 試験を目標にするとモチベーションがあがりますし、曖昧な部分をしっかり理解しておこうという気持ちになるので良いですよね!
また、書籍のご購入ありがとうございます!またRUclipsも見ていただけてありがたいです!!
わー!ご返信ありがとうございます!☺
モチベーション大事ですね。
書籍の安全性が高いコードでも解説されており、ミュータブル、イミュータブルの重要性を痛感しています。
いつもありがとうございます!!⭐
ミュータブル、イミュータブルという値が変更できるものとできないものがあると分かりました。意図せず要素が追加されないように注意したいと思いました。
見ておいてよかった。id()使って調べまくろうと思いました。
ミュータブル、イミュータブルの内容を取り扱っている動画が少ないと思ったので、ご参考になれば幸いです😊
すごく参考になりました!質問なのですが、イミュータブル変数のメモリ解放についてお聞きしたいです
イミュータブルな変数の値を変更する時、新しくメモリが確保され、その変数が示すアドレスが更新されることを初めて知り目からウロコだったのですが、この場合、どの変数にも参照されていないアドレスのメモリは一体どうなるのでしょうか?非同期に解放を行うために全ての変数が参照しているアドレスを精査しているのでしょうか?それともメモリは指示がない限り解放はされないのでしょうか?
Pythonではメモリは参照が切れると自動で解放されます。
なので、論理的には
x = 1
x = 100
と書くと、2行目のタイミングで1行目の「x=1」で確保されたメモリは解放されます。
gcというガベージコレクション用の標準モジュールを使うと、意図的にメモリを解放することもできます!
@@pythonvtuber9917 なるほど!ありがとうございます!
なるほど…つい最近=を使った代入でバグを作ったのでpythonおかしくなったとか思ってたけど、こう言う性質があったんですね。
こういった例で、値渡しをしたいとき、オブジェクトの参照渡しを回避するには、どのような手段がとられることが多いですか?
こんにちは。前回質問させていただいたのですが、すみません、もう1点教えてください。
イミュータブルなint型の変数xが関数を通しても、変更できないのは理解できたのですが、
もしも変更したい場合は、何かやり方があるのでしょうか。
C#の勉強をしていた時にrefキーワードというものがでてきたのですが、pythonにはないのかな?と思いまして。。
ご質問ありがとうございます😊
「もしも変更したい場合」というのは「オブジェクトidを変更せずに値を変えたい場合」ということでしょうか?Pythonの言語仕様でint型は「オブジェクトidを変更せずに値を変える」ことは出来ない認識です。
C#は詳しくないのでrefキーワードに該当するものがPythonにあるのかは分からないです...😵
私もよく分からないまま質問してしまい申し訳ないです。。
こういった場合↓xの値は1のまま,yは2ですよね。
def func(t):
t=2
return t
x=1
y=func(x)
関数の引数が参照を渡してたとして、最初xと結びついていたtもt=2で新たなオブジェクトidになり、xは元のオブジェクトidのままだから1なんですよね。
動画みたいにt=t+1のようにプラス1して加工してるなら、新しいオブジェクトidになるのも理解できたのですが、上記のようなただの代入だと参照先を渡してるので、xも2になりそうな気がして混乱たのでした。
イコールすると新たなオブジェクトidに代わるという理解でいいですか?
先程の質問でxを変更したいと言ったのは、c#でint型の値でもrefをつけて渡し変更すれば、元の値も変更されるというので、pythonも何かそういった技法があるのかなとふと思っただけです。すみません!
はい、記載いただいたfunc関数では t = 2をしている部分で、t は新しいidのオブジェクトに変わっています!値が変われば必ず新しいidのオブジェクトになります。
また、「int型の値でもrefをつけて渡し変更すれば、元の値も変更される」みたいな機能は、Pythonにはない認識です...😵
@@pythonvtuber9917 値が変われば必ず新しいオブジェクトidが与えられるのですね。理解しました。refについても承知しましたー✨
リストの代入をするときは基本的にすべて.copy()を書き足すべきなのでしょうか。.copy()をつけないで代入すると、後でうっかり代入前のデータを使い回してバグが生まれることがありそう
代入前の変数に影響を与えたくない場合は .copy() で別の変数にコピーしてあげるのが良いかと思います😊 あえて代入前の変数も同じように変更させたい場合は .copy() は使わず代入したら良いですね!
@@pythonvtuber9917 なるほど
あれ?色々検証しているときに、この現象にぶつかったことがあります!
つまり元のデータがおかしくなっちゃうことがありました。
もしかして、copy()ってこのために・・・。
他の人が書いているコードにcopy()と書いてあって、なんでイコールだけじゃダメなんだろう??って思ってました。
違うかな。
ご視聴ありがとうございます😊
おっしゃる通り、copy()は元のオブジェクトを変更しないために、新しいオブジェクト生成用に使います!!ミュータブルの性質を知らないと、元のデータがおかしくなった時にビックリしますよね😵
@@pythonvtuber9917 さん
やっぱり!!ありがとうございます!
色々な人の動画を観てますが、サプーさんの解説動画は私のような初学者が引っ掛かりやすい所に届くことが多い気がします。
そしていつも返信ありがとうございます。
原始的な即値ってやつ
全く同じやり方でやったのに出力が文字化けします。どうしたらいいですか?
ご質問ありがとうございます😊
単純にprint文で文字列を出力しても文字化けしますか?それともミュータブル・イミュータブルに関する独自の処理の場合に飲み発生しますか?
print(id(x))の出力と
def func(t)
t=t+999
return t
x=1
y=func(x)
の関数での参照渡し両方でなってしまいます
vs codeだから、うまく機能しないとかですかね
通常の文字列の表示も文字化けするなら、文字コードの設定の問題だと思います!
UTF-8になっているかご確認ください😉
ファイル名やディレクトリを日本語で書いてたのが原因だったみたいです!何度も質問してしまってすみません💦