我有任何字符串.像'水牛',
x='buffalo'
Run Code Online (Sandbox Code Playgroud)
我想将此字符串转换为某个变量名称,如
buffalo=4
Run Code Online (Sandbox Code Playgroud)
不仅这个例子,我想将任何输入字符串转换为某个变量名.我该怎么做(在python中)?
有没有办法在循环中在python中生成变量名并为它们赋值?例如,如果我有
prices = [5, 12, 45]
Run Code Online (Sandbox Code Playgroud)
我想要
price1 = 5
price2 = 12
price3 = 45
Run Code Online (Sandbox Code Playgroud)
我可以在一个循环或某事做,而不是手动分配price1 = prices[0],price2 = prices[1]等等.
谢谢.
编辑
很多人建议我写一个要求这个的理由.首先,有些时候我认为这可能比使用列表更方便...我不记得确切的时间,但我想我已经想过在有很多级别的嵌套时使用它.例如,如果有一个列表列表,以上述方式定义变量可能有助于降低嵌套级别.其次,今天我在尝试学习使用Pytables时想到了这一点.我刚看到Pytables,我看到在定义表结构时,列名和类型按以下方式描述:
class TableFormat(tables.IsDescription):
firstColumnName = StringCol(16)
secondColumnName = StringCol(16)
thirdColumnName = StringCol(16)
Run Code Online (Sandbox Code Playgroud)
如果我有100列,则明确键入每列的名称似乎很多工作.所以,我想知道是否有办法动态生成这些列名.
我发现能够在运行时创建新变量并创建结果字典以便稍后处理(即写入文件)非常有用:
myDict = {}
for i in range (1,10):
temp = "variable"+str(i)
vars()[temp] = myFunctionThatReturnsData() # variable1= data1, variable2 = data2,etc.
myDict[temp] = vars(temp)
Run Code Online (Sandbox Code Playgroud)
它创建了我可以用myDict [result1]调用的字典条目[result1:data1].我一直在使用vars()而没有真正理解我在做什么.我把它vars()带回一个带有局部变量(?)的字典,和
vars()[x] = y
创建[x:y]的新词典条目?
我有一个脚本,我传入一个用{input1:data1,input2:data2}准备的字典,我使用这个方法迭代所有值,存储所有结果,并将其输出到一个文件.这段代码在一个类中的函数内部,并且正在工作.
我的困惑之处在于我已经阅读了各种关于如何不与locals()混淆的帖子,以及vars()与locals()或globals()的等效(?).
所以我的问题(至少)是双重的:
1.什么是vars(),特别是vars()[x] = y,
2.这本词典的范围是什么(在编写更大的程序时我需要记住的是什么
3.这是不错的编程实践.
提前致谢!
是否可以使用Python代码创建局部变量,只给出变量的名称(字符串),以便后续调用locals()中的"'xxx'"将返回True?
这是一个视觉:
>>> 'iWantAVariableWithThisName' in locals()
False
>>> junkVar = 'iWantAVariableWithThisName'
>>> (...some magical code...)
>>> 'iWantAVariableWithThisName' in locals()
True
Run Code Online (Sandbox Code Playgroud)
出于什么目的,我需要这个技巧完全是另一个话题......
谢谢您的帮助.
首先,让我说我在创建动态命名变量时阅读了许多具有类似主题的线程,但它们主要与Python 2相关,或者它们假设您正在使用类.是的,我在Python 2和Python 3中阅读了exec函数的行为.
我也知道在99%的时间内创建动态命名的变量是一个坏主意,字典是获得的方式,但我只想知道它是否仍然可行以及exec和locals在python 3中的运行方式.
我想展示一些示例代码来说明我的问题(斐波那契计算斐波纳契数,ListOfLetters提供["A","B",......]):
def functionname():
for index, buchstabe in enumerate(ListOfLetters.create_list("A", "K"), 1):
exec("{} = {}".format(buchstabe, fibonacci(index)) ) #A = 1, B = 1, C = 2, D = 3, E = 5,...
print(index, buchstabe, eval(buchstabe)) #works nicely, e.g. prints "4 D 3"
print(locals()) #pritns all locals: {'B': 1, 'A': 1, 'index': 11, 'C': 2, 'H': 21, 'K': 89, ...
print(locals()['K']) #prints 89 as it should
print(eval("K")) #prints 89 as it should
print(K) …Run Code Online (Sandbox Code Playgroud) 我发现了与此问题相关的一些模糊的问题,但没有找到任何针对CPython的干净且特定的解决方案。我认为“有效”解决方案是特定于解释器的。
首先,我认为我了解:
locals() 给出了不可修改的字典。frame.f_locals给出了locals()类似的字典,但不太容易通过hackhacking exec。或至少我没有能力做些骇人听闻的未证明的事情,例如locals()['var'] = value ; exec ""exec 能够对局部变量做一些奇怪的事情,但它并不可靠-例如,我读到某处它在Python 3中不起作用。未经测试。因此,我了解到,鉴于这些限制,向局部变量添加额外的变量永远是不安全的,因为这会破坏解释器的结构。
但是,应该可以更改已经存在的变量,不是吗?
我考虑过的事情
f,可以访问f.func_code.co_nlocals和f.func_code.co_varnames。frame.f_locals。这是通过设置跟踪器的用例sys.settrace。变量应该在某个地方,最好是可写的...但是我找不到它。即使它是一个数组(用于有效的解释器访问),或者我需要一些额外的C特定接线,我也准备提交。
如何从跟踪函数或修饰的包装函数或类似的东西实现对变量的修改?
完整的解决方案当然会受到赞赏,但即使是某些指针也会对我有很大帮助,因为我在这里遇到了很多不可写的字典:-/
我正在重构一段代码,我遇到了以下问题.我有一个巨大的参数列表,现在我想传递给它kwargs.代码是这样的:
def f(a, b, c, ...):
print a
...
f(a, b, c, ...)
Run Code Online (Sandbox Code Playgroud)
我正在重构它:
data = dict(a='aaa', b='bbb', c='ccc', ...)
f(**data)
Run Code Online (Sandbox Code Playgroud)
这意味着我必须这样做:
def f(**kwargs):
print kwargs['a']
...
Run Code Online (Sandbox Code Playgroud)
但这是一个皮塔饼.我想保留:
def f(**kwargs):
# Do some magic here to make the kwargs directly accessible
print a
...
Run Code Online (Sandbox Code Playgroud)
是否有任何直接的方法kwargs dict可以直接访问参数,也许通过使用一些帮助类/库?
我正在使用 python 并想知道是否可以向用户询问变量的名称,然后使用该名称创建一个变量。例如:
my_name = input("Enter a variable name") #for example the user could input orange
#code to set the value of my_name as a variable, say set it to the integer 5
print(orange) #should print 5 if the user entered orange
Run Code Online (Sandbox Code Playgroud)
我知道这可以使用字典来完成,但我想知道这是否可以在不创建其他对象的情况下完成。我正在使用 python 3。谢谢。
编辑2:因为很多人都在反对这个用例可以揭示的糟糕设计.这些问题和答案的读者在使用之前应该三思而后行
我试图在Python中用它的名字设置一个变量(不是属性):
foo = 'bar'
thefunctionimlookingfor('foo', 'baz')
print foot #should print baz
Run Code Online (Sandbox Code Playgroud)
PS:通过名称(没有eval)访问变量的函数将是一个加号!
编辑:我知道字典存在,这种用法是不鼓励的,我选择将它用于一个非常特定的目的(根据环境配置文件修改),这将让我的代码更容易阅读.
If I have pre-set list variables that are the same name except for they end in a different number, how can I create variables in a for loop that will call those lists?
My issue is that the variable I create in the for loop is staying as a string. I need it to recognize that it's simply a name of a variable.
Example:
list1 = [2, 4, 3, 7]
list2 = [4, 5, 6]
list3 = [9, 5, 7, …Run Code Online (Sandbox Code Playgroud) 我试着去理解一些东西
x = 10
print x
Run Code Online (Sandbox Code Playgroud)
结果将是 10
x is 10
print x
Run Code Online (Sandbox Code Playgroud)
结果将是错误 X 未定义。
x = 10
y = 10
if x == y:
print True
if x is y:
print True
Run Code Online (Sandbox Code Playgroud)
结果是:
True
True
Run Code Online (Sandbox Code Playgroud)
是否有另一种不使用等号来定义变量的方法?
python ×13
variables ×4
arguments ×1
cpython ×1
dictionary ×1
for-loop ×1
kwargs ×1
local ×1
loops ×1
memory ×1
operators ×1
python-2.7 ×1
python-3.x ×1
string ×1