【问题标题】:Objects having same name refer to different id in python在python中具有相同名称的对象引用不同的id
【发布时间】:2019-12-19 06:20:38
【问题描述】:

在下面的代码 sn-p 中,在第 1 行和第 2 行创建了两个名为 div 的对象。

  1. python如何区分同一作用域下创建的两个div对象?

  2. 当id() 应用于两个对象时,会为类似命名的对象显示两个不同的地址。为什么会这样?

def div(a,b):
    return a/b


print(id(div)) # id = 199......1640 ################################ line 1


def smart_div(func):
    def inner(a,b):
        if a<b:
            a,b=b,a
        return func(a,b)
    return inner


a = int(input("Enter 1st: "))
b = int(input("Enter 2nd: "))
div = smart_div(div)
print(id(div)) # id = 199......3224 ############################# line 2
print(div(a,b)) 

在像 C 这样的传统语言中,不能在同一范围内创建两个具有相同名称的变量。但是,在 python 中,这条规则似乎并不适用。

【问题讨论】:

  • div = smart_div(div) 覆盖 div 对象。您将获得不同的 id 值,因为它不再由 def div 定义。如果你print(div) 你可以看到这个对象现在引用了函数 smart_div。
  • 好的。所以div 变量现在指的是smart_div() 而不是原来的div 函数。谢谢。
  • 对象没有“名称”,名称可以引用对象,但可以随时重新分配不同的名称。
  • 这个话题在这里解释得很好:nedbatchelder.com/text/names.html

标签: python python-3.x decorator python-decorators


【解决方案1】:

在像 C 这样的语言中,您可以用不同的值重命名变量。这就是您更新值的方式。在 C 中,它们必须具有相同的类型,因为 C 是一种静态类型语言。另一方面,Python 是动态类型的,这意味着它不跟踪类型。在程序中有一个表,其中名称与值相关联,当您将div 定义为同一范围内的新值时,它只是覆盖了该值,因为第二个div 稍后出现。在定义了新的div 值后,您将无法再访问函数div。

【讨论】:

    【解决方案2】:

    在 Python 中,一切(基本上)都是一个对象,它确实允许重用变量名。

    所以我相信您所做的是将变量名称 div 从指向函数的名称重新分配给指向函数 smart_div 的指针。

    您应该看到您无法访问旧的 div 功能。

    【讨论】:

    • 是的,我无法访问旧的div 功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2014-01-19
    • 1970-01-01
    • 2020-09-06
    • 2021-11-23
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多