我有一个问题似乎应该这么简单,但我无法解决。我有这部分代码:
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',我可以使用循环吗?
答案 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分别命名。只需将它们全部放入某种容器中,例如元组,列表或字典。