TL; DR:由于名称绑定在Python中是如何工作的,通常 您无法 获得传递给函数的变量的名称。一些Python对象 确实
具有name属性,但这与您在赋值语句中绑定到对象的名称不同。
您的代码在打印
ids时给您误导性信息。您实际上不是在打印
id对象的,而是在中打印
id名称字符串的
locals()
dict。
同样,当您进入
locals()函数内部时,它会向您显示该函数本地的内容。因此,要获取有关函数外部的本地对象的信息,您需要使函数能够访问
locals()您感兴趣的实际字典。
下面是代码的修改后的版本,可修复
id这些问题并将
locals()数据的副本传递给该
addr_type函数。
请注意,当您为
a或调用函数时,
c它会同时打印两个名称的信息。
我还添加了几行内容,显示了如何使用函数的属性 来
打印函数的名称
__name__。请注意,当我们打印
new_name.__name__它时,只打印了
addr_type,因为那是函数
__name__属性的值,所以我们也将其绑定到的事实
new_name是无关紧要的。
#!/usr/bin/env pythondef addr_type(context, obj): for k, v in context: # if id(v) == id(a): if v is obj: print "k: %s" % k print "v: %s" % v print "a: %s" % hex(id(v)) print print 15 * "-"a = b = c = 10b = 11for k, v in list(locals().iteritems()): if k.startswith('__'): continue print "k: %s" % k print "v: %s" % v print "a: %s" % hex(id(v)) print "##############"printif a is b: print "a and b is the same objects"else: print "a and b is NOT the same objects"if a is c: print "a and c is the same objects"else: print "a and c is NOT the same objects"if b is c: print "b and c is the same objects"else: print "b and c is NOT the same objects"printcontext = list(locals().iteritems())addr_type(context, a)addr_type(context, b)addr_type(context, c)new_name = addr_typeprint 'Function names =', addr_type.__name__, new_name.__name__
输出
k: av: 10a: 0x8dafd24##############k: cv: 10a: 0x8dafd24##############k: bv: 11a: 0x8dafd18##############k: addr_typev: <function addr_type at 0xb748e17c>a: 0xb748e17cL##############a and b is NOT the same objectsa and c is the same objectsb and c is NOT the same objectsk: av: 10a: 0x8dafd24k: cv: 10a: 0x8dafd24---------------k: bv: 11a: 0x8dafd18---------------k: av: 10a: 0x8dafd24k: cv: 10a: 0x8dafd24---------------Function names = addr_type addr_type
您可能会发现研究由Stack Overflow资深Ned
Batchelder撰写的关于Python名称和值的精彩事实和神话,对您有所帮助。
更新资料
这是一个简单的函数,
show它打印您通过它的名称,以及在您也通过它的字典中该名称的值。通过将
locals()字典传递给字典,这使它可以按名称在本地范围内查找对象。在函数内部,这是函数的局部变量。在函数之外,这就是所有全局变量。
def show(*args, names): for s in args: print(s, names.get(s, 'Not found!'))def test(t): a = 1 b = 2 c = 3 show('a', 'b', 'c', 't', names=locals())test(42)
输出
a 1b 2c 3t 42
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)