亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

賦值運算符和變量標識符

賦值運算符和變量標識符

qq_遁去的一_1 2021-10-26 16:40:11
以下代碼 (python3) 打印 5 而不是 4。x = 5y = xx = 4print(y)但是,我時不時地會發現發生相反行為的情況,即變量被分配到內存中的某個位置,而不是存儲在那里的值。有幾次我在我的代碼中發現了一個錯誤,因為這樣的事情。是否存在與上述代碼(以及在 Python 中)類似的情況,其中初學者可能希望代碼將一個變量的當前值存儲在一個新變量中,而不是分配標識符的值?另外,我的意思并不是在這里用“值”和“變量”這兩個詞來強加任何特定的數據類型,所以如果這些術語不正確,我深表歉意。如果有一些關于這種行為如何在一些常見語言(特別是 python、javascript、java、c、haskell)上變化的評論,我很想聽聽。當然,對于這個問題的適當術語(以及如何標記它)的任何建議也將不勝感激。編輯:我正在接受一個答案,該答案描述了行為如何隨不可變/可變類型而變化,因為這可能是我遇到的行為,并且我特別詢問了初學者程序員的困惑來源。但是,帶著類似問題訪問此頁面的人還應該參考評論部分,該部分表明一般答案并不像可變/不可變數據類型那么簡單。
查看完整描述

3 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

>>> 1

1

>>> id(1)

140413541333480

>>> x = 1

>>> id(x)

140413541333480

>>> z = 1

>>> id(z)

140413541333480

>>> y = x

>>> id(y)

140413541333480

>>>

出于優化的目的,只有 1 的單個副本,并且所有變量都引用它。


現在,python 中的整數和字符串是不可變的。每次定義一個新的時,都會生成一個新的引用/ID。


>>> x = 1 # x points to reference (id) of 1

>>> y = x # now y points to reference (id) of 1

>>> x = 5 # x now points to a new reference: id(5)

>>> y     # y still points to the reference of 1

1

>>> x = "foo" 

>>> y = x

>>> x = "bar"

>>> y

'foo'

>>> 

列表、字典是可變的,也就是說,你可以在同一個引用處修改值。


>>> x = [1, 'foo']

>>> id(x)

4493994032

>>> x.append('bar')

>>> x

[1, 'foo', 'bar']

>>> id(x)

4493994032

>>>

因此,如果您的變量指向一個引用并且該引用包含一個可變值并且該值已更新,則該變量將反映最新值。


如果引用被覆蓋,它將指向引用所指向的任何內容。


>>> x = [1, 'foo']

>>> y = x  # y points to reference of [1, 'foo'] 

>>> x = [1, 'foo', 'bar'] # reference is overridden. x points to reference of [1, 'foo', 'bar']. This is a new reference. In memory, we now have [1, 'foo'] and [1, 'foo', 'bar'] at two different locations. 

>>> y

[1, 'foo']

>>>


>>> x = [1, 'foo']

>>> y = x

>>> x.append(10) # reference is updated

>>> y

[1, 'foo', 10]

>>> x = {'foo': 10}

>>> y = x

>>> x = {'foo': 20, 'bar': 20}

>>> y

{'foo': 10}

>>> x = {'foo': 10}

>>> y = x

>>> x['bar'] = 20 # reference is updated

>>> y

{'foo': 10, 'bar': 20}

>>>

您的問題的第二部分(通用語言)太寬泛了,Stackoverflow 不是解決這個問題的合適論壇。請對您感興趣的語言進行研究 - 每個語言組及其論壇上都有大量可用信息。


查看完整回答
反對 回復 2021-10-26
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

x = 5   

id(x) = 94516543976904     // Here it will create a new object


y = x    

id(y) = 94516543976904    // Here it will not create a new object instead it will refer to x (because both of them have same values).


x = 4

id(x) = 94516543976928    // Here we are changing the value of x. A new object will be created because integer are immutable.



查看完整回答
反對 回復 2021-10-26
  • 3 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號