Python 不挤压引用的迭代器?

Python 不挤压引用的迭代器?,python,python-3.x,iterator,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是a 对一长串变量中的每个变量进行更改的好设计模式是什么?简短回答:你不能这么做 a = "3" b = "4" for x in (a, b): x = int(x)

我需要Python中的for循环,它可以修改迭代器中的变量,而不仅仅是处理变量的值。作为一个简单的例子,下面的例子显然不能满足我的要求,因为b的结尾仍然是一个字符串

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


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

简短回答:你不能这么做

a = "3"
b = "4"
for x in (a, b):
    x = int(x)
Python中的变量只是引用值的标记。标签上的标签是不存在的。当您在上面的代码中写入x=intx时,您只需更改x指向的内容。不是指向的值

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

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

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

print type(my_vars['b'])
现在,如果你心情不好:

由于您的变量是全局变量,因此它们实际上作为条目存储在可通过函数访问的字典中。所以你可以改变它们:

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

print type(b)

但是,就我个人而言,我不认为这是一种好的设计模式……

如果你有一个实际的变量列表,而不是你想要修改的一些单独的变量,那么列表理解将满足你的需要:

>>> 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]

正如在另一个答案中提到的,没有办法间接更新变量。您所能做的最好是通过解包显式地分配它:

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

下面的一位响应者指出了我应该在这里指出的一点:这是针对Python 3的。是的,我们可以猜测它是3.x,不仅仅是因为您使用print作为函数,而是因为输出显示而不是,并且您可能正在使用CPython…,但一般来说,如果有可能会产生不同,那么添加适当的2.7或3.x标记是值得的,因为否则一半的答案都会猜错,并给出不起作用的代码…尝试使用格式而不是%.b作为参考,因此,要重新分配它,您需要显式地调用b=某物或通过本地或本地访问它such@njzk2由于生成的代码访问局部变量加载快速操作码的方式-无需字典查找,因此可能不建议通过局部变量字典更改局部变量。编辑:这实际上是:本词典的内容不应修改;更改可能不会影响解释器所使用的本地变量和自由变量的值。如果您想得到这样的结果,只要a和b不相等,就可以使用frame对象找出哪些名称与值匹配,并以这种方式设置全局变量。或者检查帧的字节码和/或源…:@abarnert:如果它们实际上是相等的,你可能无论如何都可以处理,只要它们不等于你不想改变的东西,我想