【问题标题】:Why does this function have a different value for the same variable but the same address? [duplicate]为什么这个函数对于同一个变量但是同一个地址有不同的值? [复制]
【发布时间】:2019-08-07 20:38:51
【问题描述】:
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 找到的是参数的原始地址,而不是新创建的变量的地址?

【问题讨论】:

  • 您确定完全按照您提供的方式运行代码吗?这些结果看起来很奇怪。
  • hex(x) 是一个字符串。你得到一个字符串的id,它被创建然后立即被放弃。 ID 只需要在其各自对象的生命周期内是唯一的。由于字符串不同时存在,所以它们可以有相同的id。
  • @PatrickArtner 呃,这与整数缓存完全无关。这里发生的只是创建一个字符串,然后销毁,然后在与前一个相同的内存位置创建另一个字符串。
  • python 中的整数是缓存,如果在 -5 到 255 左右的范围内 - 无论您从哪里使用它们,它们都获得相同的 id。但是,您正在打印您立即丢弃的 int 十六进制字符串值的 id
  • @Aran-Fey 是的 - 误读并再次修复

标签: python


【解决方案1】:

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

ID 只需要在其各自对象的生命周期内是唯一的。由于字符串不同时存在,所以它们可以有相同的id。

【讨论】:

    【解决方案2】:

    您对变量作用域的理解是正确的。但是这种行为与作用域无关。在您的分析中,您错过了一个重要细节:您没有打电话给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 的原因。

    【讨论】:

    • 啊,很有道理,谢谢
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    相关资源
    最近更新 更多