使用for循环更改变量值

时间:2014-09-15 00:10:25

标签: python python-2.7

我有一个问题似乎应该这么简单,但我无法解决。我有这部分代码:

Avalue = '2:7'
Bvalue = '4?3'
Cvalue = '5\t8'
    for x in [Avalue,Bvalue,Cvalue]:
        for illChar in ['?','/','|','*','<','>',':','\n','\t','"']:
            if illChar in x:
               x = x.replace(illChar, "")
        int(x)
        print type(x)

    print type(Avalue)

输出:

 <type 'int'>
 <type 'int'>
 <type 'int'>
 <type 'unicode'>

我想要做的是去除任何非法字符,然后将Avalue,Bvalue,Cvalue更改为整数而不是字符串,以便Avalue变为27。

但是上面的代码实际上并没有改变原始变量,它只是改变了该列表中变量x的值,该值从Avalue的原始值(或Bvalue或Cvalue等)获取它的值。现在,我知道我可以单独更改每个原始变量,即Avalue = int(Avalue),但如果我最终需要更改整个变量,那么使用循环似乎更优雅。

那么,有没有办法通过像这样使用for循环来改变变量?

编辑:好的抱歉,我可能会对上面的例子造成混淆,也许这可能更有意义。假设我有以下内容:

Avalue = 'hello'
Bvalue = 'my name'
Cvalue = 'is'
    for x in [Avalue,Bvalue,Cvalue]:
          x = 'slimshady'
print Avalue

以上不起作用,Avalue仍然是'你好'。假设我想要将Avalue Bvalue Cvalue永久更改为'slimshady',我可以使用循环吗?

3 个答案:

答案 0 :(得分:0)

您正在更改变量x的值。 你应该做的是直接改变变量Avalue,Bvalue和Cvalue中的值。 将所有内容放入列表中并使用它。

list = [Avalue,Bvalue,Cvalue]
for i in range(len(list)):
    for illChar in ['?','/','|','*','<','>',':','\n','\t','"']:
        if illChar in list[i]:
           list[i] = list[i].replace(illChar, "")
    int(list[i])
    print type(list[i])

print type(list[0])

答案 1 :(得分:0)

要做你所说的str.translate,你最好的办法是删除坏字符。您可以枚举以跟踪列表的索引,以便在清除值并将其强制转换为int后重新分配值。

inputs = [Avalue, Bvalue, Cvalue]
#convert the list of illegal chars to a string
bad_chars = "".join(['?','/','|','*','<','>',':','\n','\t','"'])
for i, item in enumerate(inputs):
    #passing None as the first arg to translate deletes all the chars referenced
    item = item.translate(None, bad_chars)
    item = int(item)
    inputs[i] = item

在我看来,使用Avalue,Bvalue变量名称是多余的。只需将所有输入读入列表并使用索引进行访问。

答案 2 :(得分:0)

Python中的变量与其他语言的工作方式略有不同。 SO用户Ned Batchelder提供了一个有用的教程,其中包含可爱的图表:Facts and Myths about Names and Values in Python

你可以在OP中尝试做什么,但这不是一种很好的方法来做这种事情。

#Fun with mutability...

Avalue = ['2:7']
Bvalue = ['4?3']
Cvalue = ['5\t8']

bad_chars = '?/|*<>:\n\t"'

all_values = (Avalue, Bvalue, Cvalue)
print 'Before:', all_values

for x in all_values:
    x[0] = int(x[0].translate(None, bad_chars))

print 'After: ', all_values
print Avalue, Bvalue, Cvalue

输出:

Before: (['2:7'], ['4?3'], ['5\t8'])
After:  ([27], [43], [58])
[27] [43] [58]

稍微好一点的做法是:

bad_chars = '?/|*<>:\n\t"'

#Remove bad_chars from string s and convert to int
def convert(s):
    return int(s.translate(None, bad_chars))

Avalue = '2:7'
Bvalue = '4?3'
Cvalue = '5\t8'

Avalue, Bvalue, Cvalue = [convert(s) for s in (Avalue, Bvalue, Cvalue)]

print Avalue, Bvalue, Cvalue

但正如Michelly Menezes和b10n所说,最好为Avalue,Bvalue,Cvalue分别命名。只需将它们全部放入某种容器中,例如元组,列表或字典。