【问题标题】:Assigning variables dynamically in Python在 Python 中动态分配变量
【发布时间】:2015-01-27 09:49:05
【问题描述】:

我已将一个 numpy 数组初始化为:

import numpy as np
data = np.loadtxt('rand1.csv', delimiter=',', dtype=np.int)

导入后,“数据”如下所示:

array([[422, 858, 129, 312,  79, 371],
       [ 39, 280, 366,  13, 316,  81],
       [929,  49, 909, 734, 635, 779],
       [365, 570, 863, 108, 545, 846],
       [150, 820, 193, 373, 865, 770],
       [486, 547, 759,  56, 413, 470],
       [322, 171, 463, 998, 351,  92],
       [690, 297, 558, 476,  60, 804]])

现在我试图将这些数组项中的每一个存储在不同的变量中。也就是说,如果我的数组是nxm,应该有nm个不同的变量。 我使用的代码是:

for x in range(0,8):
    for y in range(0,6):
        str(x)+str(y)=data[x,y] 

但是,它给了我一个错误说

“语法错误:无法分配给运算符”

。 谁能告诉我在这里做错了什么以及应该如何做?

【问题讨论】:

  • “谁能告诉我我在这里做错了什么” - 整个想法是荒谬的。不要那样做。
  • 这令人失望。我是这里的新手,我想做点什么。如果我这样做的方式“荒谬”,那么这里的专家至少应该告诉我正确的做法。你在这里没有帮助我学到任何东西。
  • 按原样使用数组。你不需要中间变量。
  • 删除这个问题,发布一个新问题,解释你真正想做的事情。 “我如何获得第一行”。并且,也许,在发布之前谷歌......
  • @KarolyHorvath 我明白你在这里要表达的意思。然而,语气过于激进。这可能经常发生在 SO 上,因此没有理由将其用于新用户(当他们的第一印象如此负面时,他们为什么要回来?)。但是,我同意应该重述这个问题。

标签: python arrays loops for-loop numpy


【解决方案1】:

Python 确实是一种动态语言,通过许多努力,您可以找到一种动态创建变量的方法。但请不要尝试:

  • 这没什么用,因为您可以使用语法 data[x, y] 访问该值
  • 很难在代码中的其他任何地方使用,因为您可能不完全知道这些动态变量的数量。

如果您不想使用 numpy 数组,则可以使用列表列表。但是请不要尝试在运行时创建变量,这确实是一种反模式。

【讨论】:

  • 嗯.. 最接近的应该是字典中的key 赋值。这是一种相当合法的创建“动态”变量的方式,尽管它显然更安全,更重要的是,它是可控的。
【解决方案2】:

正如 cmets 和其他答案中提到的,这是一个的想法,很可能是 XY 问题。话虽如此,这绝对可能的:

globals()[str(x)+str(y)] = data[x, y]

这是因为globals() 返回一个将模块级变量名称(存储为字符串)映射到它们各自的对象的字典。您需要使用该字典,否则您会尝试执行以下操作:

'foo' = 'bar'

你不应该期望它是有效的。

正如所写,这是特别脆弱和毫无意义的。您正在构建的字符串是纯数字的,因此不是有效的变量名。这意味着您只能通过在 globals() 中查找它们来找到它们。这可以通过在它们前面放一个字母或单词来缓解,所以

globals()['data'+str(x)+str(y)] = data[x, y]

然后您可以通过print(data00) 等方式访问它们。

请不要真的这样做。

【讨论】:

  • 我的意思不是重复这个......但 OP 没有明确表示他们想用动态生成的变量污染全局命名空间。唯一正确的部分是 OP 希望动态创建变量,这完全可以使用用户定义的字典来实现。我并不是说它是这个特定问题的解决方案,但是在执行 myOwnDict['foo'] = 'bar' 时写 'foo' = 'bar' 是完全明智的。虽然警告新手使用 globals() 是件好事,但说“在这里,创建你自己的字典”可能会更好。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多