2011-01-18 26 views
2

Pythonで参照を割り当てる方法はありますか?参照を割り当てる

例えば、PHPで私はこれを行うことができます:

$a = 10; 
$b = &$a; 
$a = 20; 

echo $a." ".$b; // 20, 20 

は、どのように私はPythonで同じことを行うことができますか?

+4

興味のある、なぜですか?あなたはこれを何のために使うのですか? – neil

+0

良いプログラムを書く方法や、特に何かをする方法を質問しましたか? Pythonでは、このスタイルのプログラミングは不適切または不可能かもしれませんが、なぜ参照を使用したいのかは問題ではありません。彼はその質問をしており、より広い問題を解決することはしていない。 –

+0

@ノクティス:もし私たちがすべて肯定的な問題を解決すれば、このサイトは存在しません。 – SilentGhost

答えて

12

非プリミティブ型でこれを実行している場合、Pythonはこれをあなたが望むのとまったく同じように動作します。割り当ては参照を使用して行われます。だからこそ、あなたが以下を実行するとき:

>>> a = {'key' : 'value'} 
>>> b = a 
>>> b['key'] = 'new-value' 
>>> print a['key'] 

あなたは'new-value'を得ます。 は厳密にあなたが行う場合は、次の、と言って:

>>> a = 5 
>>> b = a 
>>> print id(a) == id(b) 

あなたは真取得します。

しかし!プリミティブ型は不変なので、変数b自体の値を変更することはできません。 bに基づいて、新しい値で新しい変数を作成することができます。たとえば、次の場合:

>>> print id(b) 
>>> b = b + 1 
>>> print id(b) 

あなたは2つの異なる値を取得します。

これは、Pythonが新しい変数を作成し、その値をbの値に基づいて計算し、次にこの新しい変数に名前bを与えたことを意味します。これはすべての不変型に関係します。以前の2つの例を一緒に接続する:

>>> a = 5 
>>> b = a 
>>> print id(a)==id(b) 
True 
>>> b += 1 
>>> print id(b)==id(a) 
False 

したがって、Pythonで割り当てるときは、常に参照を割り当てます。しかし、いくつかの型を変更することはできません。したがって、いくつかの変更を行うと、実際に別の参照で新しい変数を作成します。

+0

Pythonで不変オブジェクトのオブジェクトアイデンティティを持つ[注意してください](http://gist.github.com/784475)。あなたの期待通りではないかもしれません。 –

+0

ええ、面白いです。その例をありがとう。しかし、a = 257の後に\ n b = a式は常にaを与えますb == True、私は正しいですか? – ikostia

+3

pythonのプリミティブ型のようなものはありません。 – SilentGhost

2

Pythonでは、すべてがデフォルトで参照されます。だからあなたが次のようなことをしたとき:

x=[1,2,3] 
y=x 
x[1]=-1 
print y 

[1、-1,3]が表示されます。

あなたは

x=1 
y=x 
x=-1 
print y 

を行うとき、これは動作しない理由はint sが不変であるということです。彼らは変更することはできません。それについて考えると、数字は本当に変わるのですか? xに新しい値を割り当てると、新しい値を割り当てるになります。古い値は変更されません。だから、まだ古いものを指している。他の不変型(例えば、文字列とタプル)も同様に動作します。

+0

理由は、intが不変であるという事実とは何も関係ありません。 2番目の例では、xを-1に再バインドしています.yは1にバインドされたままです。 –

関連する問題