扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Python中怎么通过变量获取变量名,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联是一家专注于成都网站建设、做网站与策划设计,兰溪网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:兰溪等地区。兰溪做网站价格咨询:028-86922220
创建线程
Python中使用多线程很方便, threading.Threaded(函数, 参数表)然后thread.start就好了. 只是有一点需要注意, 上面参数表必须是个元组, 也就是每个元素后面必须跟个逗号.
import threadingdef anyFunction(aaa): return str(aaa) #某种处理结果, 比如字符串def manualInput(xxx): data = input("请输入%s: " % xxx) pass # 各种处理(比如数据转换什么的)exampleThread = threading.Thread(target = manualInput, args = ( anyFunction("汪汪汪"), ), name = "喵喵喵")exampleThread.start()
通过函数修改某个指定的(通过名字即字符串)变量的值但这又出来一个问题, 如果不能使用全局变量, 该如何在另一个函数里修改其参数对应的内容呢? 这里的重点归结起来是"函数如何修改自身参数的内容".
于是我想到了一个骚透了的方法——改变量字典…… 因为python的变量是基于标签的. python中的变量大致可以理解成给内容贴上标签(每个标签对应一个变量名, 多个标签可能会引用同一个内容, 没被引用的内容就会被python释放), 每个标签都会有一个id(同时, 一个内存数据只要被引用那么自身也有个id). 示例:
print(id("喵喵喵"),"~~", id("喵喵喵"),"~~", id("喵喵喵"),"~~")[Out]:1392371317520 ~~ 1392371317520 ~~ 1392371317520 ~~print(id("喵喵喵")); print(id("喵喵喵")); print(id("喵喵喵"))[Out]:139237131857613923713180001392371318288
python维护这些标签和内容的对应关系可以通过字典的方式来读取和修改, 改globals()[待改的变量的原名]的值就能通过指定变量名来修改变量了.
通过globals的字典修改变量
通过变量来获取变量的名字(字符串)上面通过globals()[待改的变量的原名] = 新的内容的方式实现了修改变量的内容, 可是, 待改的变量的原名是个字符串, 怎么通过变量得到这个变量的名字呢?
一个思路是字典法.
把当前运行环境中的所有变量复制一份(浅拷贝和深拷贝效果都一样, 因为深浅拷贝前后都是相同的标签), 然后新建一个"标签id-变量名"的对照表字典, 利用字典赋值的特性, 遍历复制来的全局变量, 把id(变量值)作为key而变量名作为value, 即标签id-变量名字典[id(变量值)] = 变量名.
test = "some values"变量A = "汪汪汪"当前所有变量 = globals().copy()print(当前所有变量)[Out]:{'__name__': '__main__',..., 'test': 'some values', '变量A': '汪汪汪'}内容_变量名字符串对照表 = {}for 变量名, 变量值 in 当前所有变量.items(): 内容_变量名字符串对照表[id(变量值)] = 变量名print(内容_变量名字符串对照表)[Out]:{2437914516272: '__name__',..., 2437948462576: 'test', 2437948432816:'变量A'}
这样一来就建立一个内容-变量名字符串的对照表, 又因为id(变量A) 和 id(变量A的值)是相等, 利用这个特性就能通过变量来取变量值了.
变量A的值 = 变量Aprint(id(变量A的值)[Out]:2437948432816内容_变量名字符串对照表[id(变量A的值)][Out]:'变量A'
通过函数修改变量
上面这一堆头发就是为了动态、通用地修改变量, 封装成函数就能在任何地方调用和修改了.
def 一个实现变量修改函数(要改的变量, 提示语): 当前所有变量 = globals().copy() 变量id表 = {} for 变量名, 变量值 in 当前所有变量.items(): 变量id表[id(变量值)] = 变量名 待改的变量的原名 = 变量id表[id(要改的变量)] 新的内容 = str(input(提示语)) if len(新的内容) > 0 : globals()[待改的变量的原名] = 新的内容 return 待改的变量的原名tmp = "汪汪汪"
一个实现变量修改函数(tmp, "请输入新值: ")
[Out]:请输入新值: 喵喵喵 'tmp'print(tmp)[Out]:喵喵喵
总结(demo)[不想看中间过程的话可以直接看这]
import time, threading# 这里的demo是为了通用化. 因为在一个线程中再嵌套另个线程的话, 嵌套的线程获取不到所有变量class ThreadWithReturn(threading.Thread): def __init__( self, target = None, args = () ): super(ThreadWithReturn,self).__init__() self.func = target self.args = args def run(self): self.result = self.func(*self.args) def getResult(self): try: return self.result except Exception as errInfo: print("遇到错误: ", errInfo) return Nonedef 一个实现变量修改函数(要改的变量, 提示语): 当前所有变量 = globals().copy() 变量id表 = {} for 变量名, 变量值 in 当前所有变量.items(): 变量id表[id(变量值)] = 变量名 try: 待改的变量的原名 = 变量id表[id(要改的变量)] except KeyError: print("***debug: 在不同的线程中运行, 获取不到出入变量的名字") 待改的变量的原名 = None 新的内容 = str(input(提示语)) if len(新的内容) > 0 : if 待改的变量的原名 != None: globals()[待改的变量的原名] = 新的内容 else: 新的内容 = None return [待改的变量的原名, 新的内容]def Gexit(): exitConfirm = "u" waitForConirm = ThreadWithReturn( target = 一个实现变量修改函数, args = (exitConfirm, "收到了退出信号, 默认30秒后退出, 是否现在退出呢? (Y/n) 请输入: ",) ) waitForConirm.start() waitForConirm.join(30) try: exitConfirm = waitForConirm.getResult()[1] print("***debug, got:", exitConfirm) except Exception as errInfo: print("***debug:", errInfo) exitConfirm = "u" if exitConfirm == "u": print("等待超时, 开始退出流程...") exitConfirm = "Ytt" if exitConfirm == "Ytt" or exitConfirm == "Y": if exitConfirm == "Y": print("确认退出, 开始退出流程...") pass # 这里放程序退出逻辑 if exitConfirm == "n": print("取消退出, 继续运行...") pass # 这里放继续运行的逻辑 return 0Thread_waitForExit = threading.Thread(target = Gexit, args = ())Thread_waitForExit.start()Thread_waitForExit.join(45)
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流