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找到参数的原始地址而不是新创建的变量的地址?
答案 0 :(得分:1)
hex(x)
是一个字符串。 id(hex(x))
创建一个字符串,获取其ID,然后立即丢弃该字符串。
ID仅在其各自对象的生命周期内是唯一的。由于这些字符串不同时存在,因此它们可以具有相同的ID。
答案 1 :(得分:1)
您对可变范围的理解是正确的。但是,这种行为与范围界定无关。在分析中,您错过了一个重要的细节:您没有打电话给id(t)
;您正在呼叫id(hex(t))
。
这是逐步发生的事情:
hex(5)
被调用。这将在地址31255648中创建字符串'0x5'
。id(hex(5))
返回31255648。hex(3)
被调用。这将在地址31255648中创建字符串'0x3'
。id(hex(3))
返回31255648。换句话说,您有两个对象(字符串),它们的生存期没有重叠,而恰好是在相同的内存地址上创建的,这就是它们最终具有相同的id的原因。