猿问

为什么这个函数对于同一个变量但同一个地址有不同的值?

def func(t):

    t = 5

    print('inside function', t)

    print('inside function address = ', id(hex(t)))


x = 3

func(x)

print('outside function',x)

print('outside function address = ', id(hex(x)))

这打印


inside function 5

inside function address =  31255648

outside function 3

outside function address =  31255648

我的理解是在没有赋值的函数中引用的变量将使用其范围之外的变量。但是如果函数有赋值,那么它会在内存的新空间中创建一个新变量并在那里赋值。


为什么函数 id 找到的是参数的原始地址而不是新创建的变量的地址?


胡子哥哥
浏览 228回答 2
2回答

森林海

您对变量作用域的理解是正确的。但这种行为与范围界定无关。在你的分析中你错过了一个重要的细节:你没有打电话id(t);你打电话id(hex(t))。这是正在发生的事情,一步一步:hex(5)叫做。这将'0x5'在地址 31255648 处创建字符串。id(hex(5)) 返回 31255648。不再需要该字符串并进行垃圾收集。hex(3)叫做。这将'0x3'在地址 31255648 处创建字符串。id(hex(3)) 返回 31255648。换句话说,您有两个对象(字符串),它们的生命周期没有重叠,并且恰好在相同的内存地址处创建,这就是它们最终具有相同 ID 的原因。

噜噜哒

hex(x)是一个字符串。id(hex(x))创建一个字符串,获取其 id,然后立即丢弃该字符串。ID 只需要在其各自对象的生命周期内是唯一的。由于字符串不同时存在,它们可以具有相同的 id。
随时随地看视频慕课网APP

相关分类

Python
我要回答