1樓:
def inc(foo):
foo[0]+=1
for i in foo:
print(id(i))
print(id(foo[0]))
print(i in foo)
print(i is foo[0])
i+=1
print(id(i))
print(id(foo[0]))
foo=[1]
inc(foo)
print(foo)
輸出1564240016
1564240016
True
True
1564240032
1564240016
[2]這個應該可以說明問題了:
原本i和foo[0]是同乙個物件,id相同,print(i is foo[0])也得到true。
但是在執行了foo[0]+=1和i+=1以後,id(i)變了,id(foo[0]沒變。
這是因為id是不可變物件,而foo[0]是可變物件。
補充:關於物件可不可變,其實會牽涉到指標問題。
比如i=1,涉及到2個物件,變數i和數字1。
id(i)和id(i)並不相等,它們的關係是i存放著1的位址(i是指向1的指標)。
python的不可變物件,是指如果對不可變物件+=1,那麼會生成乙個新的物件,而不是原地修改。所以id會變。舉例i+=1,實質上會涉及4個變數,i,i',1和2.
i指向1,i'指向2,互不干擾。
而對於可變物件,就是直接原地修改,id不會變。
@shellpaul
請你幫我看看這個說法對不對呢?
但我還是不明白:
判斷i是可變否是什麼依據呢?
i指向1,1是不可變的int,所以i就不可變——是這個邏輯嗎?
那麼按道理,foo[0]的初始值也是1,也該不可變才對啊?
(當然我知道foo[0]作為列表元素時可變的,那麼雙重屬性下又怎麼界定呢)
2樓:
試想:會不會i只是複製foo[0]的值,於是用print(i is foo[0])看,結果輸出true,這說明它們指向同乙個物件。
i 不是複製 foo[0] 的值
你也用 is 語句試過了,i 就是 f[0]
那為什麼 += 1 之後就變了呢?這個和值的型別有關。
簡單來講,就是整型是不可變的,做了 += 1 的操作自然就是另乙個整型物件了。
Python 中數值型別、字串、元組都是常見的不可變型別。
>>> l = "This is a test case.".split()
>>> l
['This', 'is', 'a', 'test', 'case.']
>>> for i, s in enumerate(lprint(s is l[is += "-copy"print(s is l[iTrue
False
True
False
True
False
True
False
True
False
>>> l2 = [[1, 2, 3], [4, 5, 6]]
>>> for i, li in enumerate(l2print(li is l2[ili += [0] # 注意,這裡不是說不論怎樣的運算都不會變,而是 += 這個運算,你可以改為 li = li + [0] 試試
... print(li is l2[i])
True
True
True
True
>>> l2
[[1, 2, 3, 0], [4, 5, 6, 0]]
>>> l3 = [(1, 2, 3), (4, 5, 6)]
>>> for i, li in enumerate(l3print(li is l3[ili += (0print(li is l3[i])
True
False
True
False
y 1 x 1 x , x 0,1 的影象是什麼?
沒有現代軟體,退而求其次,用上古時期的GrafEq畫的 先導出PCX再到BMP再到PNG,可麻煩了 不過效果並不遜色於現代軟體呢 笑 已登出 define zhihux 1x floor 1x define x letloop tmp 0.00001 if tmp1.6 cons tmp loop ...
如何評價美劇《人類清除計畫》S1E01?
閃閃歸來 剛剛看了人類清除計畫4 the first purge 講的就是第一次作為實驗性質在Staten Island進行的第一次清洗,從電影可以了解到這是乙個低收入地區,居民多是有色人種,劇版的S01E03中有提到軍人兄妹一家就是這個島上的居民,被NFFA忽悠只要投出贊成票同意留在島上並參與清洗...
如何正面證明 0,1 上無理數的測度等於1?
零 可測是顯然的。一 正測集可以以任意大的比例佔據某個區間。把這結論稍微改改,正測集也可以以任意大的比例佔據某個有理數為端點的區間 簡稱有理區間 二 無理數在每個有理區間中所佔的比例都是一樣的。因為有理區間內的無理數集可以表示成 0,1 內無理數集的乙個 有理線性變換 係數都是有理數的線性變換 一和...