関数に渡された代入演算子、コンストラクター、およびパラメーターが、特にリストとオブジェクトを使用して Python でどのように機能するかを理解しようとしています。パラメータとしてリストを持つクラスがあります。空のリストに初期化してから、コンストラクターを使用して入力したいと考えています。私はそれを行う方法がよくわかりません。
私のクラスが -
class A:
List = [] # Point 1
def __init1__(self, begin=[]): # Point 2
for item in begin:
self.List.append(item)
def __init2__(self, begin): # Point 3
List = begin
def __init3__(self, begin=[]): # Point 4
List = list()
for item in begin:
self.List.append(item)
listObj = A()
del(listObj)
b = listObj
次の質問があります。誰かがそれぞれのケースで何が起こるかを明らかにできれば素晴らしいだろう -
ポイント1のように空の宣言は有効ですか? 何が作成されますか?NULL を指す変数?
ポイント 2 とポイント 3 のどちらが有効なコンストラクターですか? ポイント 3 では、渡されたリスト (begin) の新しいコピーが作成されず、代わりに変数 List がポインター「begin」を指していると推測しています。ポイント 2 のようにコンストラクターを使用すると、リストの新しいコピーが作成されますか?
del を使用してオブジェクトを削除するとどうなりますか? リストも削除されますか、または含まれているオブジェクトで del を呼び出す前に、List で del を呼び出す必要がありますか? Python が GC を使用していることは知っていますが、GC が作動する前であっても未使用のメモリをクリーンアップすることを懸念している場合、その価値はありますか?
また、タイプ A のオブジェクトを別のオブジェクトに割り当てると、2番目のオブジェクトが最初の右を指すだけになりますか? もしそうなら、ディープコピーを行うにはどうすればよいですか? 演算子をオーバーロードする機能はありますか? Pythonはおそらくこれよりもはるかに単純であることを知っているため、質問です。
編集: 5. ポイント 2 とポイント 3 を使用しても違いがないことに気付きました。リストの先頭からの項目は、参照によってのみコピーされ、新しいコピーは作成されません。そのためには、list() を使用して新しいリストを作成する必要があります。これは、私が推測した後、私がそれを見た後、理にかなっています。
ありがとう!