请选择 进入手机版|继续访问电脑版
发新帖

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

[复制链接]
4421 38

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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()


谢谢!

举报 使用道具

回复

精彩评论38

honeybeeswingin  新手上路  发表于 2018-4-3 12:59:26 | 显示全部楼层
这是啥语言?

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 13:04:30 | 显示全部楼层
getattr

举报 使用道具

回复
chesterzzy  新手上路  发表于 2018-4-3 13:09:54 | 显示全部楼层
setattr(self,  '变量名字符串')  #设置属性
getattr(self, '变量名字符串') #获取属性

#另外兄弟你的缩进得加强

举报 使用道具

回复
dwjgwsm  新手上路  发表于 2018-4-3 13:14:53 | 显示全部楼层
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-4-3 13:15:13 | 显示全部楼层
locals[x] = v
不就得了

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 13:16:58 | 显示全部楼层
locals()[x] = v
忘了加括号

举报 使用道具

回复
dwjgwsm  新手上路  发表于 2018-4-3 13:30:41 | 显示全部楼层
不是楼上想的那样,我希望能够在后面的代码中直接引用 abcd 这个变量,而不是 locals()['abcd']这样引用

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 13:47:44 | 显示全部楼层
我就想问问为什么要这么干

举报 使用道具

回复
swift3030  新手上路  发表于 2018-4-3 13:53:05 | 显示全部楼层
python 有 ast 库的吧

举报 使用道具

回复
dwjgwsm  新手上路  发表于 2018-4-3 13:59:45 | 显示全部楼层
因为在后面代码中引用这些变量的时候全部都得写成 locals()['abcd']这种形式,和其他变量的引用方式不一致,非常不协调.
比如后面的代码是这样的:

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

这样整个代码显得非常不协调

举报 使用道具

回复
dwjgwsm  新手上路  发表于 2018-4-3 14:00:54 | 显示全部楼层
@Swift3030 麻烦详细说说,谢谢!

举报 使用道具

回复
congeec  新手上路  发表于 2018-4-3 14:06:27 | 显示全部楼层
@dwjgwsm ast.literal_eval

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 14:11:10 | 显示全部楼层
@dwjgwsm 如果你需要在后面的代码中直接 print(abcd) ,说明'abcd'这个字符串根本就是一个编译期间的常量,那么为什么不直接用 abcd = v 这种操作,然后后面的判断直接用 if a>abcd:不就得了
如果 x 所指代的字符串是编译期间未知的,那么不管你是在前面赋值还是后面判断的时候都只能已字典取值的形式访问,上面所说的用 AST 模块并不能解决你的问题
还有,这里的 abcd 既然是个局部变量,那么叫什么名字很重要么,出了函数范围就被删除了,何必那么在乎他的名字

举报 使用道具

回复
dwjgwsm  新手上路  发表于 2018-4-3 14:13:24 | 显示全部楼层
@congeec ast.literal_eval 和 eval 都是不行的.你没明白我的意思,我的意思是要创建一个变量 abcd,而不是 abcd=eval('v')

举报 使用道具

回复
yu099  新手上路  发表于 2018-4-3 14:14:22 | 显示全部楼层
emmmm,为什么不把变量放到字典里面,然后用到时再取呢

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 14:21:53 | 显示全部楼层
@dwjgwsm 你是要动态创建一个局部变量么,那么问题在于有什么意义呢,这个变量叫 abcd 和叫 a 有什么区别,请贴出你具体的应用场景,要不然别人没办法理解你到底要做什么

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 14:25:27 | 显示全部楼层
你要是问 exec 为什么在函数中无效,那么我倒是可以给你解释,因为 exec 是对 locals()和 globals()进行修改的,而 locals()只是对当前函数内的局部变量的深拷贝,所以对他的修改出了 exec 函数就失效了,也就是你不可能通过 exec 函数达到你的目的

举报 使用道具

回复
congeec  新手上路  发表于 2018-4-3 14:30:31 | 显示全部楼层
@dwjgwsm eval('abcd = None') 不行么?

举报 使用道具

回复
wwqgtxx  新手上路  发表于 2018-4-3 14:31:01 | 显示全部楼层
@congeec 在函数内部不会生效的,要是在模块级别倒是可以

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表