どのように y を x に等しくするか オブジェクトによって呼び出されるものを呼び出しますが、関数呼び出しはありません どのように動作するか y 値を変更する方法
y = [1, 2, 3]
x = y
x[:] = [-1]*3
print y
[-1, -1, -1]
x と y で何が起こるか、オブジェクトによって何が呼び出されるかを説明してください
どのように y を x に等しくするか オブジェクトによって呼び出されるものを呼び出しますが、関数呼び出しはありません どのように動作するか y 値を変更する方法
y = [1, 2, 3]
x = y
x[:] = [-1]*3
print y
[-1, -1, -1]
x と y で何が起こるか、オブジェクトによって何が呼び出されるかを説明してください
y = [1, 2, 3]
x = y
x
どちらも同じリストをy
指しています。
x[:] = [-1]*3
そのリストは、オブジェクト全体のスライスへの割り当てによって変更されます (こちらを参照)。
print y
# [-1, -1, -1]
変更されたリストがコンソールに出力されます。
ちなみに、「オブジェクトによる呼び出し」はありません。これは単なるスライスへの割り当てです(リンクに記載されているように、オブジェクトを変更します)。
そうx=y
することで、同じオブジェクトへの2つの参照を作成するだけで、オブジェクトは変更可能であるため、変更することもできます。
>>> y = [1, 2, 3]
>>> sys.getrefcount(y)
2
>>> x = y # now y also points to the same object
>>> sys.getrefcount(y)
3
>>> x is y
True
次に、メモリ内の同じオブジェクトをポイントしx
ます。y
X-----------------------|
|
--------------
| [1, 2, 3] |
| |
|------------|
|
|
Y-----------------------|
次に、参照のいずれかを使用してそのオブジェクトを変更します。
>>> x.append(4) #modify object using either x or y
>>> x,y
([1, 2, 3, 4], [1, 2, 3, 4])
次に、そのオブジェクトへの参照の 1 つを削除します。y とします。
>>> del y
>>> x #but you can still access that object using x
[1, 2, 3, 4]
リストはpythonのオブジェクトであり、単純な変数ではありません。c ++のポインターと
x=y
同じように、ポインターを等しくします.xの変更は、同じオブジェクトが含まれているため、yにも実装されます。