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我的理解是在没有赋值的函数中引用的变量将使用其范围之外的变量。但是如果函数有赋值,那么它会在内存的新空间中创建一个新变量并在那里赋值。为什么函数 id 找到的是参数的原始地址而不是新创建的变量的地址?
2 回答
森林海
TA贡献2011条经验 获得超2个赞
您对变量作用域的理解是正确的。但这种行为与范围界定无关。在你的分析中你错过了一个重要的细节:你没有打电话id(t)
;你打电话id(hex(t))
。
这是正在发生的事情,一步一步:
hex(5)
叫做。这将'0x5'
在地址 31255648 处创建字符串。id(hex(5))
返回 31255648。不再需要该字符串并进行垃圾收集。
hex(3)
叫做。这将'0x3'
在地址 31255648 处创建字符串。id(hex(3))
返回 31255648。
换句话说,您有两个对象(字符串),它们的生命周期没有重叠,并且恰好在相同的内存地址处创建,这就是它们最终具有相同 ID 的原因。
噜噜哒
TA贡献1784条经验 获得超7个赞
hex(x)
是一个字符串。id(hex(x))
创建一个字符串,获取其 id,然后立即丢弃该字符串。
ID 只需要在其各自对象的生命周期内是唯一的。由于字符串不同时存在,它们可以具有相同的 id。
添加回答
举报
0/150
提交
取消