如何在python中将变量转换为字符串
我遇到了一个跟这个类似的问题,不过我不知道这个术语是什么。
cat = 5
dog = 3
fish = 7
animals= [cat, dog, fish]
for animal in animals:
# by animal name, I mean the variable name that's being used
print(animal_name + str(animal))
它应该输出
cat5
dog3
fish7
所以我在想,有没有什么方法或者函数可以用来获取正在使用的变量名,并把它当作字符串返回呢?
9 个回答
2
好吧,使用 f-strings 来处理:
cat = 5
print(f"{cat=}")
结果是:
cat=5
5
用字典来代替一堆变量。
animals = dict(cat=5, dog=3, fish=7)
for animal, count in animals.iteritems():
print animal, count
请注意,它们的顺序可能和你放进去时不一样(很可能不会保持原来的顺序)。如果你想要保持顺序,可以使用 collections.ordereddict
,或者如果你只是想要它们按一致的顺序排列,可以直接对键进行排序:
for animal in sorted(animals.keys()):
print animal, animals[animal]
16
你基本上是在问:“我的代码怎么能找到一个对象的名字?”
def animal_name(animal):
# here be dragons
return some_string
cat = 5
print(animal_name(cat)) # prints "cat"
这里引用Fredrik Lundh在comp.lang.python上的一段话,特别合适。
就像你发现的那只猫,你想知道它的名字:这只猫(对象)自己不能告诉你它的名字,而且它其实也不在乎——所以唯一的方法就是问问你所有的邻居(命名空间),看看这只猫(对象)是不是他们的……
……而且不要惊讶,如果你发现它有很多名字,或者根本没有名字!
为了好玩,我尝试用sys
和gc
模块来实现animal_name
,发现邻居们也在用好几个名字叫你亲切称呼的“猫”,也就是字面上的整数5:
>>> cat, dog, fish = 5, 3, 7
>>> animal_name(cat)
['n_sequence_fields', 'ST_GID', 'cat', 'SIGTRAP', 'n_fields', 'EIO']
>>> animal_name(dog)
['SIGQUIT', 'ST_NLINK', 'n_unnamed_fields', 'dog', '_abc_negative_cache_version', 'ESRCH']
>>> animal_name(fish)
['E2BIG', '__plen', 'fish', 'ST_ATIME', '__egginsert', '_abc_negative_cache_version', 'SIGBUS', 'S_IRWXO']
对于一些独特的对象,有时候你确实可以得到一个独特的名字:
>>> mantis_shrimp = 696969; animal_name(mantis_shrimp)
['mantis_shrimp']
所以,总结一下:
- 简短的回答是:你不能。
- 详细的回答是:其实,有时候你可以——至少在CPython的实现中。想看看我例子中
animal_name
是怎么实现的,可以看这里。 - 正确的答案是:使用
dict
,正如其他人提到的。这是当你真的需要用名字和对象关联时的最佳选择。