6

Pythonでは、すべての識別子または変数名が実際のオブジェクトへの参照であることを認識しています。

a = "hello"
b = "hello"

2つの文字列を比較すると

a == b

出力は

True

Javaで同等のコードを記述した場合、出力はfalse、実際のオブジェクトではなく、参照(異なる)間で比較されるためになります。

したがって、ここで私が見ているのは、参照(変数名)が実行時にインタープリターによって実際のオブジェクトに置き換えられていることです。

したがって、「インタプリタがすでに割り当てられている変数名を確認するたびに、それを参照しているオブジェクトに置き換える」と考えるのは安全ですか?グーグルで検索しましたが、探していた適切な答えが見つかりませんでした。

4

3 に答える 3

17

実際にJavaで実行した場合、文字列のインターンが原因でおそらくtrueと出力されると思いますが、それは多少関係ありません。

「参照しているオブジェクトに置き換える」とはどういう意味かわかりません。実際に起こることは、あなたが書くときa == b、Pythonはを呼び出すa.__eq__(b)ということです。これは、他のメソッドが引数として呼び出すのaと同じです。b

Javaのようなものと同等のものが必要な場合は、演算子==を使用します。これは、名前が等しいと比較されるかどうかに関係なく、名前がと同じオブジェクトを参照するかどうかを比較します。isa is bab

于 2012-08-07T02:48:07.710 に答える
7

Pythonインターン:

>>> a = "hello"
>>> b = "hello"
>>> c = "world"
>>> id(a)
4299882336
>>> id(b)
4299882336
>>> id(c)
4299882384

短い文字列は自動的にインターンされる傾向があり、その理由を説明していa is b == Trueます。詳細については、こちらをご覧ください。

于 2012-08-07T02:58:40.027 に答える
6

等しい文字列が常に同じIDを持っているとは限らないことを示すため

>>> a = "hello"+" world"
>>> b = "hello world"
>>> c = a
>>> a == b
True
>>> a is b
False
>>> b is c
False
>>> a is c
True

また:

>>> str([]) == str("[]")
True
>>> str([]) is str("[]")
False
于 2012-08-07T03:35:46.440 に答える