V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wwqgtxx  ›  全部回复第 52 页 / 共 193 页
回复总数  3842
1 ... 48  49  50  51  52  53  54  55  56  57 ... 193  
2018-03-31 14:02:35 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@dwjgwsm 还有个办法,用一个 data 类来存储
class DefaultNamespace(object):
def __init__(self, default_value=None):
super(DefaultNamespace, self).__setattr__("_default_value", default_value)

def __getattribute__(self, item):
try:
return super(DefaultNamespace, self).__getattribute__(item)
except AttributeError:
pass
except KeyError:
pass
return super(DefaultNamespace, self).__getattribute__("_default_value")

def __getstate__(self):
return self.__dict__

然后你在函数开头来 data = DefaultNamespase()
后面就直接用 data.abcd = xxxx 还有 if(data.abcd > xxx) 这种就行了,看着也相对舒服一点
2018-03-31 13:28:31 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@dwjgwsm 你自己用一个 dict 来进行操作不好么,总是用 locals()和 exec()这种函数天知道时候会出错
2018-03-31 12:59:22 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
另外一点,能不要用 locals()就不要用,你自己创建一个 dict 不好么,locals()存在的目的只是为了用来读取的,任何修改 locals()的行为都是未定义的,也就是说天知道会在什么环境什么版本就就会崩掉
2018-03-31 12:57:13 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
如果你怕多线程同时修改基类数据的问题,你需要的是加锁,而不是用这种蹊跷意淫
在函数的开头把基类的 dict 给 copy 一份,在函数结尾再 update 回去,当然记得在 copy 和 update 的时候加锁,要不然会出现很多意想不到的问题
2018-03-31 12:55:08 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
另外你提到了多进程,那么很遗憾的告诉你,如果你想用一个共同基类来在多进程中共享数据,那么你可以试试看,他们之间的数据根本就不会保持同步,你要是说多线程那还可以理解,否则你就需要进行进程间通讯来交换数据
2018-03-31 12:53:13 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@dwjgwsm “会将 run 中的很多局部变量集中保存到基类中的一个字典变量中”,你就不能直接在基类的字典变量中直接操作么,还要“下一次运行时,首先恢复这些局部变量”不觉得很多余么,如果你说你就是不想每次都调用 xxx_dict['aaa']这种非要用 aaa 这种形式调用,我只能告诉你没有办法 python 不支持引用别名这种操作,你可以去用 C++去,python 中无论如何都不可能实现这样的操作
在你的上一个问题 /t/439895 中,@chenstack 已经告诉你了,python 的 locals()是不可更改的,你觉得他能修改那是因为他只是一份复制,并不是真正的局部命名域,换句话说不可能动态批量生成一批局部变量
2018-03-31 12:43:40 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
说到底,你在模块级别可以那样写只是因为你这样的操作把 x1 这个变量定义成了一个全局变量了,他从这个模块外部是可以被访问的
而你在一个函数内部声明了一个叫 x1 的变量和声明了一个叫 x2 的变量有什么区别,他都是指向一块栈内存而已,出了这个函数谁也访问不到他,那么他的名字有出了给你看着舒服还有什么意义
如果你用过 C/C++这种语言就知道了,变量的名字根本就不会被保存下来,编译期间就被擦除了,运行时完全没人知道他叫什么名字
2018-03-31 12:36:47 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
问题是你后面为什么要用一个动态的变量名,在一个函数的内部
x='abcd'
locals()['v']=np.arange(5)
v=np.arange(5)
exec(x+"=v")
print(abcd)
这种代码和
v=np.arange(5)
x = v
printf(x)
这两种代码你能告诉我有什么区别么
2018-03-31 12:35:30 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@dwjgwsm 你这种在任何一个 IDE 中都会报错的用法自己看着不觉得扎眼么,至于 python 的设计者为什么这么做的原因很简单,你对一个函数内的局部命名作用域的修改并没有什么意义,出了函数不还是被销毁了
比如你上面的例子和你
dict0 = {'x1': np.arange(5), 'y1': np.arange(5) * 2}
print(dict0['x1'])
这样写有什么本质上的区别么
2018-03-31 12:25:49 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@congeec 在函数内部不会生效的,要是在模块级别倒是可以
2018-03-31 12:22:10 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
你要是问 exec 为什么在函数中无效,那么我倒是可以给你解释,因为 exec 是对 locals()和 globals()进行修改的,而 locals()只是对当前函数内的局部变量的深拷贝,所以对他的修改出了 exec 函数就失效了,也就是你不可能通过 exec 函数达到你的目的
2018-03-31 12:17:39 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@dwjgwsm 你是要动态创建一个局部变量么,那么问题在于有什么意义呢,这个变量叫 abcd 和叫 a 有什么区别,请贴出你具体的应用场景,要不然别人没办法理解你到底要做什么
2018-03-31 12:08:57 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
@dwjgwsm 如果你需要在后面的代码中直接 print(abcd) ,说明'abcd'这个字符串根本就是一个编译期间的常量,那么为什么不直接用 abcd = v 这种操作,然后后面的判断直接用 if a>abcd:不就得了
如果 x 所指代的字符串是编译期间未知的,那么不管你是在前面赋值还是后面判断的时候都只能已字典取值的形式访问,上面所说的用 AST 模块并不能解决你的问题
还有,这里的 abcd 既然是个局部变量,那么叫什么名字很重要么,出了函数范围就被删除了,何必那么在乎他的名字
2018-03-31 10:41:03 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
我就想问问为什么要这么干
2018-03-31 10:30:01 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
locals()[x] = v
忘了加括号
2018-03-31 10:29:22 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
locals[x] = v
不就得了
2018-03-31 09:35:07 +08:00
回复了 dwjgwsm 创建的主题 Python 如何在类中将字符串转换成变量名?
getattr
2018-03-31 00:16:56 +08:00
回复了 LeungJZ 创建的主题 iPhone iPhone6 更新了 11.3 感觉还是没啥区别,还是该慢还是慢。
第 n 个不看说明的人了,你就不会点上面的更多资料看看苹果官方文档么
1 ... 48  49  50  51  52  53  54  55  56  57 ... 193  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1561 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
Developed with CodeLauncher
♥ Do have faith in what you're doing.