Python初学者におすすめのis演算子の使い方

このQ&Aのポイント
  • Python初学者にとって、is演算子は重要な概念です。is演算子は、左辺と右辺のオブジェクトが同じオブジェクトであるかどうかを判断します。
  • 具体的には、オブジェクトの値が同じであっても、異なるオブジェクトである場合にはFalseを返します。
  • 例えば、str1 = "555"とstr2 = "555"とした場合、str1 == str2はTrueを返しますが、str1 is str2はFalseを返します。
回答を見る
  • ベストアンサー

演算子is... 初学者 Python 3

毎度おせわさまです。Pythonに関する質問です。 今回は演算子isについて。 ネット上の初心者むけサイトで独学に励んでいるのですが、演算子isは、左辺と右辺のオブジェクトが同じオブジェクトだった場合には「True」を返します、とありました。 変数を、 str1 = "555" str2 = "555" として、 print str1 == str21 #1 print str1 is str2 #2 とすると #1は、オブジェクトの値が同じなのでTrueを返すが、#2はオブジェクトが同一ではないのでFalseを返す、と。 なるほど、なるほど。と思いながら実際に書いてみると、#1も#2もTrueを返すのですが・・・・・ バージョンの違いでしょうか?なんでしょうか???今使ているのはPython2.7です。 ご回答よろしくお願いいたします。

  • Python
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

間違い、とも言えません。 手許のPython 2.7.6で、会話モードから id("555") を繰り返すと、違う値になることがあります。 「"555"と書いたら常に同じオブジェクト」と保証されているわけはない、ということでしょう # 公式資料が提示できればいいのですが...ちょっと見つからなくて #2はオブジェクトが同一ではない「場合がある」のでFalseを返す「ことがある」 くらいに考えてはどうでしょうか?

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

どこに書いてあったか忘れてしまいましたが Pythonでは、同じ文字列リテラルに同じオブジェクトを再利用することがあります。 今回の場合、内部では str555= "555" str1 = str555 str2 = str555 のように動作しています。 str1 = "555" str2 = "5"+"55" 等とすれば、 ==とisで違いが出ると思います。 また、 t1=(1,2) t2=(1,2) とタプルやリストを使っても違いが出ます。 なお、数値型では a==bならa is bだったはずです。 is で比較される「識別値」は、組み込み関数 id で求められます。

0603104
質問者

補足

確かにそうなりました!ありがとうございます。 ・・・ということは今回参照したネットの情報が間違いだということでしょうか??

関連するQ&A

  • Pythonの変数等について

    Pythonで以下のコードについておしえてください 1,2,3、4について この右辺と左辺をあわせたものは変数ですか?それともどちか片方だけが変数ですか? 5について 5,print("支払金額は" + str(total_price) + "円です") カッコの中は引数ですよね? 引数の中にstr(total_price)という関数が入っているということですか? 1,apple_price = 200 2,kazoeru_kazu = input("りんごの数を入力してください") 3,count = int(kazoeru_kazu) 4,total_price = apple_price * count 5,print("支払金額は" + str(total_price) + "円です")

  • pythonコードについて

    以下のpythonコードに関して質問があります。なぜ一度Falseになったatsplitがforループ内で再びTrueになるのでしょうか?以下にコードと結果を掲載しております。 def split_string(source,splitlist): output = [] atsplit = True for char in source:    if char in splitlist:      atsplit = True      print atsplit    else:       if atsplit:          output.append(char)          atsplit = False          print atsplit       else:          output[-1] = char return output out = split_string("This is a test-of the,string separation-code!"," ,!-") print out #>>> ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code'] False True False True False True False True False True False True False True False True False True ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code']tsplit = True

  • C#の??演算子に変わるものは?

    お世話になっております。 Visual Studio 2005にて開発していますが VBにおいてC#の??演算子に変わるものがあれば教えていただけませんか? ちなみに??演算子は newClass = class1 ?? defaultClass みたいな使い方で、左辺がNULLの時に右辺を適応します。 VBでは・・・ newClass = IIF( class1 Is Not Nothing , class1 , defaultClass ) みたいな書き方になるのでしょうか? 演算子がないものかなぁ・・と。 MSDNのVBの演算子を見てみましたが、それらしきものが発見できませんでした・・・

  • 演算子のオーバーロードについて

    []演算子のオーバーロードでつまづきました。 代入文で左辺、右辺、両方ともに[]演算子を使う場合 int &operator[](int i) { return a[i]; } int &operator[]のようにして、戻り値を参照型にしています。 このとき、main関数内で、 ob1[2]=ob2[2];(ob1,ob2はoperator[]関数が関連付けられているクラスのオブジェクト) のようにすると、左辺(ob1)にちゃんと代入されています。 つまりこの場合、main()関数内で、 (int &)型の(this->a[i])(元のオブジェクトは、ob1) に (int &)型の(this->a[i])(元のオブジェクトは、ob2)を代入しているのでしょうか?

  • 比較演算子===と!==について

    PHP初心者です。 まず、===と!==が型が同じかどうかを比較する演算子だという事は調べて分かりました。 問題は以下のソースコードに関してです。 <?php class foo { public $a = 3; } class hoge { public $a = 3; } //真偽を文字列に変換する関数 function trueOrFalse($comp) { return $comp? 'true':'false'; } //4つの比較演算子を用いた比較の結果の表示 function compareObject($var1, $var2) { print('$var1 == $var2 --'.trueOrFalse($var1 == $var2)."\n"); print('$var1 != $var2 --'.trueOrFalse($var1 != $var2)."\n"); print('$var1 === $var2 --'.trueOrFalse($var1 === $var2)."\n"); print('$var1 !== $var2 --'.trueOrFalse($var1 !== $var2)."\n"); } //オブジェクトの生成 $f0 = new foo(); $f1 = new foo(); //$f0を代入、$f2は、$f0と同じオブジェクトを指す $f2 = $f0; $h0 = new hoge(); //結果の表示 print("同じクラス、プロパティが同じ\n"); compareObject($f0, $f1); print("同じオブジェクトを参照\n"); compareObject($f0, $f2); print("異なるクラス、プロパティは同じ\n"); compareObject($f0, $h0); ?> この結果分からないのは$f0と$f1の比較で===はfalseに!==はtrueになる事です。 型が違うとは一体どういう事なのでしょうか。 また、付け足す形になりますが、$f0と$h0の比較についても分かりません。 値は両方3です。 なのに==はfalseに!=はtrueになります。 これはどうしてでしょうか。 アドバイスどうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 論理演算について教えて下さい。

    基本的な論理演算について教えて下さい。 例えば、変数aにTrueを、変数bにNullを代入し、 a and b をした場合、Nullになるのは、わかるんですが、 a or b をした場合、なんでTrueになるんですか? 又、変数aにFalseを、変数bにNullを代入し、 a or b をした場合、Nullになるのは、わかるんですが、 a and b をした場合、なんでFalseになるんですか? お願いです。教えて下さい。。。 理由がわかりません。。。。

  • python: ストアする値を更新するコード

    pythonコードの質問です 入力は、画像のExcelシートのA列のようになっています 1行目:その後入力される単語の数 2行明以降:テキスト(ここでは野菜名) これに対して次のコードで「判定」をかけました #----------------------- #数値入力(入力される単語数) t = int(input()) flag = 0 store = 0 i = 0 for i in range(t): #野菜名判定 txt = input() #Tomatoの入力を1として変数flagに代入 if txt.count("Tomato") == 1: flag = 1 store = flag print("iは " + str(i) + "-----") print("判定 " + str(flag == 1 & (store - i) > 0)) print("storeは " + str(store)) i += 1 else: flag = 0 print("iは " + str(i) + "-----") print("判定 " + str(flag == 1 & (store - i) > 0)) print("storeは " + str(store)) i += 1 #----------------------- 2番め以降の入力を for i in range(t)で回し、"Tomato"がみつかると、flagに1を立てます そしてflagの値を、次に"Tomato"が出現するまでstoreに代入して保存 flag == 1 (Tomatoが出現した入力)and (store - i) > 0 となった場合にTrue それ以外はFalse 判定をさせようとしています "Tomato"が入力されても、一定期間はTrue判断にしたくないため、 (store - i) > 0 でジャッジしています ところがi == 7のとき、storeの値が本来storeで8になるべきところが、1のまま変化がおきていないため、本来"判定"がTrueであるべきがFalseとなります store値を上の条件「(store - i) > 0」で更新させたい つまり i が 7のとき、store は 8 ですが、コードのどこが間違っているのでしょうか 他のジャッジ方法でもかまいません

  • perl 条件演算子 範囲演算子についてです

    演算子 条件演算子 条件演算子 ?: は条件式の値により、2者のうちのどちらかを選択します。 $a=($x<10)?10:20; 変数$aの値が$x<10という条件において、真であれば:左側の10を選び、偽であれば:右側の20を選ぶ。 $a=10; 変数$aに10を代入する。 $a==5?print "5です。\n":print "5ではありません。\n"; 条件式でaが5であれば:左側の print "5です。\n"を表示します。 条件式でaが5でなければ:右側の print "5ではありません。\n"を表示します。 $a==10?print "10です。\n":print "10ではありません。\n"; 条件式でaが10であれば:左側の "10です。\n" を表示します。 条件式でaが10でなければ:右側の "10ではありません。\n" を表示します。 範囲演算子 範囲演算子 .. は、左側の値から右側の値まで、1つずつ増やした値の集まりです。 値には、半角英数字の数値または文字列が指定できる。 print 3..5; 3 4 5 と表示する。 一応、訳を下に書いたのですが合っていますでしょうか。

  • インクリメント/デクリメント演算子を使った計算

    Javaでのインクリメント演算子とデクリメント演算子を 使った計算についての質問です。 int a = 10; int b = a++ + ++a + --a - a--; このコード処理後の変数a,bの値の計算方法(考え方)が つかめず苦戦しています。 解答はa=10,b=22だそうです。 ちなみに例えば次のコードのb=a++;のように 右辺と左辺が1つずつの場合は理解しやすいです。 int a = 1; int b = 0; b = a++; //処理A 処理A後の変数a,bの値は b=aをした後でa=a+1を行うので a=2,b=1 となることは理解できます。 ご教授のほどよろしくお願いします。

  •  三項演算子で違いが判らない

     三項演算子で 変数「$data」>=10 の場合”10以上”、それ以外なら”10以下”と表示する。 <?php $data = 15; $str = ($data >= 10)?"10以上":"10以下"; print $str; ?>  以上は理解できます。  しかし以下はほとんど理解できません!? <?php if (isset($argv[1])){ $param = $argv[1]; } else {     $param = 'default'; } 二つは同じ三項演算子で同類ということですが、  アバウトな質問のような気がしますが、違いを教えていただけますか!  よろしくお願いします。

    • ベストアンサー
    • PHP