python foo 1 foo 0 1與for i in foo i 1,為何輸出不同

時間 2021-06-16 10:35:20

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 內無理數集的乙個 有理線性變換 係數都是有理數的線性變換 一和...