【WEEK4 - SET】 Copy by value 與 Copy by reference的疑問

大家好 我是見明
在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

3個讚

Hi 我把這個問題拿去問Wilson,得到的答覆如下

4個讚

補充Wilson解釋:

set基本上就是元素的集合。對集合來說,也就只是元素的連接而已,set不支援item assignment,也就是說,對集合來說,如果去改變集合內的元素,那只是改變記憶體內部線走資料的串接方式而已。

3個讚

特別感謝 Aeon幫忙提問,我需要再多一點時間吸收消化 :sweat_smile:

1個讚