パイソン冷知識(13インストールガイド)
差LIST1 + = LIST2及びLIST1 = LIST1 + LIST2
alpha = [1, 2, 3]
beta = alpha # alpha 的别名
beta += [4, 5] # alpha 和 beta 都是[1, 2, 3, 4, 5]
beta = beta + [6, 7] # 此时beta的内存地址已经变成了,[1, 2, 3, 4, 5, 6, 7]
print(alpha) # alpha 还是 [1, 2, 3, 4, 5]
これは、変数のデータの種類で起こる+=
独自のメモリアドレスは変わらず、単にアドレスの値を変更します。beta + [6, 7]
リターンそれらが追加されているメモリのアドレスと、この時点ではありませんbeta
何の関係。
_None_ではなく、変数のデータ・タイプの関数やクラスの定義で使用しました
いくつかの単語の男は、直接コードに、言いました!
def func(msg, dic={}): # 把{} 改成None ,因為{}在函數定義的時候就會生成,每次調用都是它
'''模擬實際開發中,嘗試從文件中拿到字典,如果沒有就返回一個空字典'''
import json
try:
return json.load(msg)
except:
return dic
foo = func('bad data')
foo['name'] = 'hahaha'
bar = func('also bad data')
bar['age'] = 18
print(foo)
print(bar)
'''
{'name': 'hahaha', 'age': 18}
{'name': 'hahaha', 'age': 18}
'''
このコードで、foo
そしてbar
空の辞書機能は、予めメモリの存在下で定義されている場合ので、同じオブジェクトを受け取りました。同様に、クラスで定義された変数のデータ型ならば、そのクラスは、すべてのサブクラスは、データを操作することができます!
イテレータ(反復)人気の知識
- 内蔵機能
iter()
イテレータが渡された場合、それはに戻ります自体、渡されたが、反復オブジェクトである場合、各呼び出しが返され、新たなイテレータを。 - 知識の上に話すので、主に次のとおりです。場合は、イテレータの反復が完了し、そしてそれはまだに入れることができる
for
循環が、彼はすでに空のイテレータアップ。私たちは、プログラム内の同じイテレータを繰り返し呼び出しを避けるために試してみてください!することができiter(obj) is iter(obj)
、オブジェクトを決定するために用いられるので、イテレータではありませんiteration
それを好きではない、あなたが使用することはできませんisinstance()
。 - 拡張:上述
iter()
オブジェクトは、イテレータが自分に戻りますですので、多くの学生はなるでしょうlist()
かset()
、それは、着信データの同じタイプは、独自にそれを返します。ここで?これ残念ながら、それは返し入ってくるオブジェクトの簡易コピーを。 - 上記の拡張を続ける:
str()
そしてtuple()
そこには、独自の同じデータ型の戻りを通過しました!(私はその理由を見つけます?) - **** ****キー:イテレータは、要素のリストを格納していません!それだけで、現在の元のリストを保持インデックス、次の要素へのインデックスポイントを。反復が完了する前にリストを変更するのであれば、その後、反復内容が変更されます。追加:反復反復辞書の同等ではありません
key
取得しますvalue
。
スライスは浅いコピーであります
私はこのような問題に遭遇したプロジェクトの過程で、私はその要素として別のリストにリストに行くが、コピーの問題を忘れてしまいます。
a = []
b = [1,3]
a.append(b)
b += [6]
a # [1, 3, 6] 但是这不是我要的数据
# 将 a.append(b) 改为a.append(b[:]) 可以解决问题,更深的就需要用的深拷贝了
コールド知識
bool类
親クラスですint类
!dict类
あり.__dict__
、属性は、それがインスタンスではありません!公然ことを与えられていないされていることを敢えてdict
何もあり__dict__
、このプロパティ!ただし、継承された場合にはdict类
、クラスのインスタンスが存在している__dict__
属性は!