如何在类中将字符串转换成变量名?

2018-03-31 09:18:11 +08:00
 dwjgwsm
import numpy as np
class aa:
def run(self):
x='abcd'
v=np.arange(5)
exec(x+"=v") #exec 在类中不好使. 如何实现创建变量 abcd=np.arange(5) ?
print(abcd)

if __name__ == '__main__':
r=aa()
r.run()


谢谢!
4329 次点击
所在节点    Python
38 条回复
honeybeeSwinging
2018-03-31 09:32:42 +08:00
这是啥语言?
wwqgtxx
2018-03-31 09:35:07 +08:00
getattr
chesterzzy
2018-03-31 09:54:49 +08:00
setattr(self, '变量名字符串') #设置属性
getattr(self, '变量名字符串') #获取属性

#另外兄弟你的缩进得加强
dwjgwsm
2018-03-31 10:14:01 +08:00
setattr(self,x,v)
不行啊,还是 print(abcd)报错啊

是不是我没表达清楚啊,变量 abcd 不是类 aa 的属性,就是一个局部变量,我要实现的就是 abcd=np.arange(5) 这样的结果

缩进怎么弄?我发表主题的时候试图前面加空格,但是发表之后空格被删掉了
是不是要加{} 我再试试
{import numpy as np
class aa:
def __init__(self):
pass
def run(self):
x='abcd'
locals()['v']=np.arange(5)
v=np.arange(5)
exec(x+"=v")
print(abcd)

if __name__ == '__main__':
r=aa()
r.run()
}
wwqgtxx
2018-03-31 10:29:22 +08:00
locals[x] = v
不就得了
wwqgtxx
2018-03-31 10:30:01 +08:00
locals()[x] = v
忘了加括号
dwjgwsm
2018-03-31 10:38:24 +08:00
不是楼上想的那样,我希望能够在后面的代码中直接引用 abcd 这个变量,而不是 locals()['abcd']这样引用
wwqgtxx
2018-03-31 10:41:03 +08:00
我就想问问为什么要这么干
Swift3030
2018-03-31 10:56:41 +08:00
python 有 ast 库的吧
dwjgwsm
2018-03-31 11:08:53 +08:00
因为在后面代码中引用这些变量的时候全部都得写成 locals()['abcd']这种形式,和其他变量的引用方式不一致,非常不协调.
比如后面的代码是这样的:

a=np.array(5)+4
b=np.array(5)*2
c=(a>b) & (a>locals()['abcd'])
......

这样整个代码显得非常不协调
dwjgwsm
2018-03-31 11:09:47 +08:00
@Swift3030 麻烦详细说说,谢谢!
congeec
2018-03-31 11:43:25 +08:00
@dwjgwsm ast.literal_eval
wwqgtxx
2018-03-31 12:08:57 +08:00
@dwjgwsm 如果你需要在后面的代码中直接 print(abcd) ,说明'abcd'这个字符串根本就是一个编译期间的常量,那么为什么不直接用 abcd = v 这种操作,然后后面的判断直接用 if a>abcd:不就得了
如果 x 所指代的字符串是编译期间未知的,那么不管你是在前面赋值还是后面判断的时候都只能已字典取值的形式访问,上面所说的用 AST 模块并不能解决你的问题
还有,这里的 abcd 既然是个局部变量,那么叫什么名字很重要么,出了函数范围就被删除了,何必那么在乎他的名字
dwjgwsm
2018-03-31 12:11:34 +08:00
@congeec ast.literal_eval 和 eval 都是不行的.你没明白我的意思,我的意思是要创建一个变量 abcd,而不是 abcd=eval('v')
yu099
2018-03-31 12:17:05 +08:00
emmmm,为什么不把变量放到字典里面,然后用到时再取呢
wwqgtxx
2018-03-31 12:17:39 +08:00
@dwjgwsm 你是要动态创建一个局部变量么,那么问题在于有什么意义呢,这个变量叫 abcd 和叫 a 有什么区别,请贴出你具体的应用场景,要不然别人没办法理解你到底要做什么
wwqgtxx
2018-03-31 12:22:10 +08:00
你要是问 exec 为什么在函数中无效,那么我倒是可以给你解释,因为 exec 是对 locals()和 globals()进行修改的,而 locals()只是对当前函数内的局部变量的深拷贝,所以对他的修改出了 exec 函数就失效了,也就是你不可能通过 exec 函数达到你的目的
congeec
2018-03-31 12:23:27 +08:00
@dwjgwsm eval('abcd = None') 不行么?
wwqgtxx
2018-03-31 12:25:49 +08:00
@congeec 在函数内部不会生效的,要是在模块级别倒是可以
dwjgwsm
2018-03-31 12:27:07 +08:00
@wwqgtxx x 所指代的字符串就是未知的,看来就是没有别的更好的办法了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/443030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX