一个不压缩引用的迭代器?

时间:2014-08-29 20:33:25

标签: python python-3.x iterator

我想在Python中使用for循环来修改迭代器中的变量,而不仅仅是处理变量的值。作为一个简单的例子,以下显然没有做我想要的,因为b最后仍然是一个字符串。

a = 3
b = "4"
for x in (a, b):
    x = int(x)
print("b is %s" % type(b))

(结果为"b is a <class 'str'>“)

“对一长串变量中的每个变量进行更改”有什么好的设计模式?

3 个答案:

答案 0 :(得分:4)

简短的回答:你不能这样做。

a = "3"
b = "4"
for x in (a, b):
    x = int(x)

Python中的变量只是引用值的标记。 Theres不是&#34;标签上的标签&#34;。如果您使用上述代码编写x = int(x),则只需更改x指向的内容。不是尖锐的价值。


  

什么是好的设计模式&#34;对一长串变量中的每个变量进行更改&#34;?

我不确定真正理解,但是如果你想做那样的事情,也许你应该把你的价值不是作为单独的变量存储,而是作为字典中的值或作为对象的实例变量存储。

my_vars = {'a': "3",
           'b': "4" }
for x in my_vars:
    my_vars[x] = int(my_vars[x])

print type(my_vars['b'])

现在,如果你处于黑暗的情绪中:

由于您的变量是 globals ,它们实际上存储为字典中的条目(可通过globals()函数访问)。所以你可以改变它们:

a = "3"
b = "4"
for x in ('a', 'b'):
    globals()[x] = int(globals()[x])

print type(b)

但是,就我自己而言,我不会称之为&#34;良好的设计模式&#34; ......

答案 1 :(得分:2)

如另一个答案所述,没有办法间接更新变量。您可以做的最好的事情是使用解包显式明确指定:

>>> a = 3
>>> b = 4
>>> a, b = [int(x) for x in a, b]
>>> print "b is %s" % type(b)
b is <type 'int'>

答案 2 :(得分:0)

如果你有一个实际的变量列表(而不是你想要修改的一些个别变量),那么列表理解会做你想做的事情:

>>> my_values = [3, "4"]
>>> my_values = [int(value) for value in my_values]
>>> print(my_values)
[3, 4]

如果您想进行更复杂的处理,可以定义一个函数并在列表推导中使用它:

>>> my_values = [3, "4"]
>>> def number_crunching(value):
...     return float(value)**1.42
... 
>>> my_values = [number_crunching(value) for value in my_values]
>>> print(my_values)
[4.758961394052794, 7.160200567423779]