2014-03-27 62 views
2

在您说要使用字典之前,我想要更改实际变量的值。更改名称在字符串中的python变量的值

这是标准的字典策略会发生什么:(请注意,我没有必要使用列表,该值可能是一个复杂的类类型或只是一个普通的INT)

>>> dict = {} 
>>> x = [1,2,3] 
>>> dict["x"] = x 
>>> x 
[1, 2, 3] 
>>> dict["x"] 
[1, 2, 3] 
>>> dict["x"] = [4,5,6] 
>>> dict["x"] 
[4, 5, 6] 
>>> x 
[1, 2, 3] 
>>> 

任何人都知道一个这样做的方式,以便x的实际内容也被改变? copy.deepcopy也没有办法。 (如在“字典[‘X’] = copy.deepcopy(X)”)

+2

您不确信您不需要字典。 –

+0

为什么你想通过他们的名字访问变量?请参阅[将数据保留在变量名称之外](http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html) –

+0

@LevLevitsky我希望x在分配后包含[4,5,6]。 – Inbl

回答

4

采用分片分配:

>>> d = {} 
>>> x = [1, 2, 3] 
>>> d['x'] = x 
>>> d['x'][:] = [4, 5, 6] 
>>> x 
[4, 5, 6] 
>>> d['x'] 
[4, 5, 6] 

对于其它数据类型确保您对其进行修改就地不是为它们指定的到新的变量。请注意,对于像int,字符串等不可变数据类型,不存在可用的就地操作。

+0

这对于OP来说不起作用:'(注意,我不一定使用列表,该值可能是一个复杂的类类型或只是一个常规的int)'。 –

+0

当然,但*原则*是相同的 - 修改数据就地,不要覆盖它。 –

+2

@ThaneBrimhall:没有办法修改int。 –

2

这是一个可怕的想法和可怕的代码味道的臭......不这样做,你需要重构代码是明智的....这是一个可怕的想法,但如果你想

mutables = { 
"x":x,"y":y,"Z":Z #make sure the dict key is exactly the same as var name 
} 

mutables['x'] = [5,6,7] 
for k,v in mutables.items(): 
    globals()[k] = v 

请注意,您将需要处于与原始变量相同的全局范围内

+0

是的,我知道这是一个糟糕的情况,我希望代码的所有者会重构它,因为我没有权限改变它。 – Inbl

相关问题