我剛剛想出了一個代碼示例:
ls = [2222, 1111]
a = ls[0]
print(a is ls[0])
a, ls[1] = ls[1], a
print(ls)
列印:
True
[2222, 2222]
我的問題是,為什么與上述情況a不同的物件ls[0]?該a is ls[0]檢查True,因此它必須是相同的:
ls[0], ls[1] = ls[1], ls[0]
但事實并非如此。后者產生[1111, 2222]. 這是什么奧秘?
uj5u.com熱心網友回復:
簡單賦值對目標的先前值沒有影響。
后
ls = [2222, 1111]
a = ls[0]
兩個a和的第一個元素ls是整數的參考2222。
那作業
a, ls[1] = ls[1], a
實際上與
t = ls[1], a # The tuple (1111, 2222)
a = t[0] # Set a to t[0] == 1111
ls[1] = t[1] # Set ls[1] to t[1] == 2222
您從未修改過ls;的第一個元素 您只更改了a所指的內容和第二個元素ls所指的內容。你可以看到ais now 指的是1111,因為那ls[1]是之前 ls[1]被修改過的值。
>>> print(a)
1111
uj5u.com熱心網友回復:
您沒有設定 ls[0]!
修復它:
ls = [2222, 1111]
# Assigns ls[0] to a, but not changes ls[0]!
a = ls[0]
print(a is ls[0])
# Assigns ls[1] to a and a to ls[1]. At this point ls[1] is a!
a, ls[1] = ls[1], a
print(ls)
# Now ls[0] is assigned!
ls[0] = a
print(ls)
輸出:
True
[2222, 2222]
[1111, 2222]
順便說一句:您可以通過以下方式進行反向串列:
ls = [2222, 1111]
print(ls[::-1])
輸出:
[1111, 2222]
uj5u.com熱心網友回復:
從字面上看,物件a也不ls[1]是:它們分別是識別符號和訂閱。雖然它們在運算式中使用時評估為物件,但這并不會使它們與這些物件相同——并且“它們的”物件的身份也不會擴展到它們。
- 該運算式的
a is ls[0]意思是“評估a和ls[0]比較結果的同一性”。它不檢查識別符號a是否與訂閱相同ls[0]。
值得注意的是,當在賦值陳述句中使用時,兩者a和ls[1]都不表示“查找物件的運算式”,而是表示“將物件分配給的目標”。前者的特點不影響后者。
該陳述句同時a, ls[1] = ls[1], a使用aandls[1]作為運算式和目標:
右手邊是表情。它表示“評估結果的元組
ls[1]和a”。左邊是作業。它表示“分配給識別符號
a和訂閱ls[1]”。
對識別符號的分配總是立即的:識別符號先前參考的值無關緊要。具體來說,a先前參考的物件也被 參考ls[0],這無關緊要,它的新參考物件也被 參考ls[1]。
要理解為什么這種區別很重要,請考慮識別符號“等同于”文字的情況:
>>> # integers < 256 are interned
>>> a = 12
>>> # identifier "is identical to" literal
>>> a is 12
True
如果運算式中的身份等同于賦值中的身份,那么設定a = 13現在將重新分配兩者a 并12具有值13。
uj5u.com熱心網友回復:
此代碼將不起作用,因為在這種情況下,您有對物件ls[0]的參考,而不是對記憶體位置的參考ls[0]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408037.html
標籤:
