【问题标题】:Python – assign variable under different name also depending on user input [duplicate]Python – 根据用户输入分配不同名称的变量[重复]
【发布时间】:2016-01-23 06:56:35
【问题描述】:

我的代码看起来有点像这样:

import os, sys

ABC = ''
XYZ = ''
FOO = ''
BAR = ''
ITEM = ''
CLEAN = ''
values = ['ABC', 'XYZ', 'FOO', 'BAR', 'ITEM', 'CLEAN']

# some code here

c = raw_input('> ')
if ' ' in c:
    c = c.lower()
    c = c.split()
    if c[0] == 'set':
        if c[1] in values:
            exec("%s = '%s'" % (c[1], c[2]))
        else:
            # error...

# the code continues

如您所知,我正在尝试为变量赋值,但根据用户输入来决定该变量,而不是通过其名称来引用它。

基本上,我想要的是在开始时将c[2] 字符串分配给任一变量,这取决于用户在c[1] 中选择的变量,并且在此过程中,通过相同的别名引用这些变量(或类似的东西)。

# Desired input
> set FOO yes
> print FOO

# Desired output
yes

# Desired input 2
> set ITEM dark
> print ITEM

# Desired output 2
> dark

我什么都想不出来。

================================================ ==============================

编辑:我编辑了代码以查看是否有帮助,但没有。无论我用 set 输入什么,它都会卡在 else 条件下。

编辑 2:这就是解决我的问题的方法:

1) 将values 列表转换为所有字符串 2)将.upper()添加到c[1]

感谢 Leopold 发现问题所在。

【问题讨论】:

  • 你的 if 条件 if c[1] == str(val) 永远不会成功,因为列表中的所有元素都是空的
  • 是的,values 只是一个空字符串列表。您无法获得变量的实际名称。
  • 我可以看到你正在尝试做“变量变量”,这对于有经验的 Python 程序员来说很少是正确的做法,对于没有经验的程序员来说也不是正确的做法。它笨拙、缓慢且脆弱,99.9% 的时间(至少)完全没有必要。

标签: python string variables reference alias


【解决方案1】:

你有三个不同的错误。

  1. values 是变量值的列表,而不是它们的名称。所以它们都等于''。您想要一个变量名称列表,如下所示:

    values = ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"]
    
  2. 变量的名称是大写的,但是您将命令字符串转换为小写。如果输入set ITEM dark,它将转换为['set', 'item', 'dark'],并且由于'item' != 'ITEM',它将找不到要设置的行进值。你应该跳过这一行

    c = c.lower()
    

    而只是让命令名不区分大小写

    if c[0].lower() == 'set':
    
  3. val + " = %s" % c[2]的结果是ITEM = dark,所以它会尝试将变量ITEM的值设置为变量dark的值,但是这个变量不存在。您想将其设置为字符串"dark",因此需要引号:val + " = '%s'" % c[2]

最后:这是一件很奇怪的事情,你为什么要这样做?对于我能想到的大多数用例,最好使用字典,如下所示:

userSetVariables = dict( (k,'') for k in ["ABC", "XYZ", "FOO", "BAR", "ITEM", "CLEAN"] )

c = raw_input('> ')
if ' ' in c:
    c = c.split()
    if c[0].lower() == 'set' and userSetVariables.has_key(c[1]):
        userSetVariables[c[1]] = c[2]

这会导致:

> set ITEM dark
>>> print userSetVariables["ITEM"]
dark

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多