为什么对于相同的变量但相同的地址,此函数具有不同的值?

时间:2019-03-17 08:12:39

标签: python

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找到参数的原始地址而不是新创建的变量的地址?

2 个答案:

答案 0 :(得分:1)

hex(x)是一个字符串。 id(hex(x))创建一个字符串,获取其ID,然后立即丢弃该字符串。

ID仅在其各自对象的生命周期内是唯一的。由于这些字符串不同时存在,因此它们可以具有相同的ID。

答案 1 :(得分:1)

您对可变范围的理解是正确的。但是,这种行为与范围界定无关。在分析中,您错过了一个重要的细节:您没有打电话给id(t);您正在呼叫id(hex(t))

这是逐步发生的事情:

  1. hex(5)被调用。这将在地址31255648中创建字符串'0x5'
  2. id(hex(5))返回31255648。
  3. 不再需要该字符串,并且已对其进行垃圾回收。
  4. hex(3)被调用。这将在地址31255648中创建字符串'0x3'
  5. id(hex(3))返回31255648。

换句话说,您有两个对象(字符串),它们的生存期没有重叠,而恰好是在相同的内存地址上创建的,这就是它们最终具有相同的id的原因。