大家好 我是見明
在wilson老師課程中提到
某些datatype是 copy by value,某些是copy by reference
而SET是copy by reference,不過在pythontutor看程式執行過程似乎要滿足某些條件
才是copy by reference,所以提出來與大家討論
以下情境一,原有set01,要再加入一個list,且這個list裡面是放tuple
set01 = {'evening',1}
#tuple add to set
tuple01 = [(1,'eng'),(100,'math'),(98,'CHEM')]
#adding tuple
set01.update(tuple01)
print(set01)
set02 = set01.copy()
print(set02)
set02.discard((1,'eng')) #只是把set02中的reference移除
print(set02)
在pythontutor的結果
看完上面程式執行的過程,我原以為set01 copy到set02後,set02會是全新的set,包含裡頭放的tuple也與原來的無關,但沒想到tuple還是同一個,discard後只是把reference移除
以下情境二,這次單純點,set只加入一個單純的list,程式執行過程看起來就沒有reference的問題
思考何時會有reference?不是單純依datatype( list / tuple / dict / set )
而是上述datatype再加上巢狀內容??
set01 = {'evening', 1}
# list add to set
list01 = ['eng', 'math', 'CHEM']
# add list
set01.update(list01)
print('set01加入list:', set01)
set02 = set01.copy()
print('set02複製set01:', set02)
del list01[0] # 刪除list元素也不會對已經加入list的set造成影響
print('刪除list元素影響set01:', set01)
print('刪除list元素影響set02:', set02)
set02.discard('eng')
print('set02移除元素對set01無影響:', set01)
print('set02移除元素後:', set02)
感謝小梁今日的分享及各位同學的分享資訊
有機會再研究一下
Grace:我是看這篇才比較理解他們的差異XD https://ithelp.ithome.com.tw/articles/10209104
智盛:用 id() 找出記憶體位置
CarryXu:http://dokelung.me/category/python/python-evaluation-strategy/
智盛: http://wsfdl.com/python/2013/08/16/理解Python的深拷贝和浅拷贝.html