def func(t): t = 5 print('inside function', t) print('inside function address = ', id(hex(t)))x = 3func(x)print('outside function',x)print('outside function address = ', id(hex(x)))這打印inside function 5inside function address = 31255648outside function 3outside function address = 31255648我的理解是在沒有賦值的函數(shù)中引用的變量將使用其范圍之外的變量。但是如果函數(shù)有賦值,那么它會在內(nèi)存的新空間中創(chuàng)建一個新變量并在那里賦值。為什么函數(shù) id 找到的是參數(shù)的原始地址而不是新創(chuàng)建的變量的地址?
2 回答

森林海
TA貢獻2011條經(jīng)驗 獲得超2個贊
您對變量作用域的理解是正確的。但這種行為與范圍界定無關(guān)。在你的分析中你錯過了一個重要的細節(jié):你沒有打電話id(t)
;你打電話id(hex(t))
。
這是正在發(fā)生的事情,一步一步:
hex(5)
叫做。這將'0x5'
在地址 31255648 處創(chuàng)建字符串。id(hex(5))
返回 31255648。不再需要該字符串并進行垃圾收集。
hex(3)
叫做。這將'0x3'
在地址 31255648 處創(chuàng)建字符串。id(hex(3))
返回 31255648。
換句話說,您有兩個對象(字符串),它們的生命周期沒有重疊,并且恰好在相同的內(nèi)存地址處創(chuàng)建,這就是它們最終具有相同 ID 的原因。

嚕嚕噠
TA貢獻1784條經(jīng)驗 獲得超7個贊
hex(x)
是一個字符串。id(hex(x))
創(chuàng)建一個字符串,獲取其 id,然后立即丟棄該字符串。
ID 只需要在其各自對象的生命周期內(nèi)是唯一的。由于字符串不同時存在,它們可以具有相同的 id。
添加回答
舉報
0/150
提交
取消