1.Pythonの変数
python
そしてjava
、の変数は本質的に異なります。
java
変数で変数を宣言するときは、変数のデータ型、int、str、または特定の型を指定する必要があります。そうすると、仮想マシンはメモリ内のスペースを適用します。スペースのサイズはタイプに関連しています。 。一般的な理解は、変数をボックスとして想像することであり、ボックスに含めることができるものは最初に設定されます。
たとえばa=1
、ボックスに1を入力します。
python
変数は基本的にポインターであり、ポインターのサイズは同じです。たとえば、int型へのポインタ、ポインタ自体のサイズは固定されており、int自体が占めるメモリサイズを考慮する必要はありませんが、とにかくメモリに配置されます。intオブジェクトにアクセスするときにのみポインタを見つける必要があります。
テイクa=1
1を格納するためのスペース、そして、1ポイントを開くために、第1のメモリにint型のオブジェクトを宣言するために、。
a = [1,2,3]
b = a
b.append(4)
print(a) # [1,2,3,4]
ボックスのアイデアを使用してここを理解する場合:リストを[1,2,3]
1つのボックスに入れ、aを別のボックスに入れると、bを変更した後にaを印刷しても、aは変更されません。
a = [1,2,3]
b = a
print(a is b) # True
is
またことが分かるa
和がb
されているのと同じオブジェクトであるa
、id
の値b
尖った物体がid
同じであるの値尖った物体。
2。==との違いは
- です
最後に、a = [1,2,3] b = a
aとbは同じオブジェクトだと言いました。では、2つの割り当ての場合はどうなるでしょうか。
a = [1,2,3]
b = [1,2,3]
ptint(a is b) # False
print(id(a) == id(b)) #False
結果から、この時点でのaとbは異なるオブジェクトです。つまり、代入ステートメントを使用すると、オブジェクトが再宣言されます。
次のような特別な場合があります
a = 1
b = 1
print(a is b) #True
python
内部intern
メカニズム-特定の範囲内で同じ小さな整数に遭遇した場合、新しいオブジェクトは生成されず、元のオブジェクトを直接指します。内部最適化メカニズム。
同じことが小さな文字列にも当てはまります。
a = "abc"
b = "abc"
print(a is b) #True
使用はクラスを判断することです
class People:
pass
person = People()
# isinstance(person,People)
if type(person) is People:
print('Yes') # Yes
クラス自体はオブジェクトであり、オブジェクトがグローバルに一意であるためperson
に実際ポイントPeople
ので、type(person)
及びPeople
IDが同じです。
- ==
a = [1,2,3]
b = [1,2,3]
ptint(a == b) # True
aはlist型のオブジェクトです。魔法の関数はlistに実装されています__eq__
。==に遭遇すると、この関数を呼び出して、オブジェクトの値が等しいかどうかを判断します。
3.delステートメントとガベージコレクションメカニズム
python
のガベージコレクションアルゴリズムは、参照カウントを使用しています。
最初の定義a=1
、b=a
およびその後1が自動的にこのオブジェクトのカウンタを生成し、a=1
時間カウンタは、1だけ増加するb=a
Bもを指すことを示す。このとき、1だけカウンタが増加し、二つの変数と1と同等ですそれを指しています。
del a
オブジェクトを削除すると、カウンターが1つ減ります。カウンターが0に減少すると、Pythonインタープリターはオブジェクトを再利用します(常にメモリ内で占有することはできません)。
C ++のdeleteステートメントは、Pythonとは異なり、オブジェクトを直接再利用するためのものです。
栗をあげる
a=object()
b=a
del a
print(b) # object object at 0x0000000003D90F0
print(a) # name a is not defined
上記の結果は、bは印刷できますが、aは印刷できないということです。このプロセスでは、オブジェクトaを削除し、参照カウンターを1デクリメントします。
ときpython
インタプリタは、オブジェクトを再利用し、それは、オブジェクトの呼び出します__del__
魔法の機能を。したがって、ガベージコレクションを行う場合、オブジェクトがリサイクルされるときに特定のリソースが解放されることを期待してい__del__
ます。これは、関数のオーバーロードによって実現できます。
class A:
def __del__(self):
pass
4.受信リストに関する注意事項
最初のケース
def add(a,b):
a+=b
return a
if __name__ == "__main__":
a = 1
b = 2
c=add(a,b)
print(c) # 3
print(a,b) # 1 2
2番目のケース
def add(a,b):
a+=b
return a
if __name__ == "__main__":
a = [1,2]
b = [3,4]
c=add(a,b)
print(c) # [1,2,3,4]
print(a,b) # [1,2,3,4] [3,4]
この時点で、リストは変数タイプであり、操作中に+ =記号が元のリスト変数aに直接割り当てられているため、入力aが変更されていることがわかります。したがって、元のaが変更されています。
3番目のケース
def add(a,b):
a+=b
return a
if __name__ == "__main__":
a = (1,2)
b = (3,4)
c=add(a,b)
print(c) # (1,2,3,4)
print(a,b) # (1,2) (3,4)
総括する
3つの異なるタイプのパラメーターが渡されると、リストオブジェクトのみが元のデータに影響を与えます。
そのため、オブジェクトを関数に渡すときに、オブジェクトがlist、dict
値を変更できる型である場合、元のデータが変更される可能性があります。