【问题标题】:Is it possible to initialize an array variable in a for loop (python)? [duplicate]是否可以在 for 循环(python)中初始化数组变量? [复制]
【发布时间】:2021-11-12 03:39:16
【问题描述】:

场景:字典包含许多我想要提取的列表。 伪代码:例如

Dict = {'a':[1,2,3], 'b':[2,3,4], 'c':[4,5,6]}

结果,我想创建一个以 for 循环中的键命名的数组。可能吗? 我想要a = [1,2,3], b = [2,3,4], c=[4, 5, 6],而不必键入 a = []、b = []、c = [] 并单独附加它们,是否有自动在 for 循环中执行此操作?

结果:

a = [1,2,3]
b = [2,3,4]
c = [4,5,6]

我目前的解决方案: 创建一个类

class Container:
     def __init__(self):
         self.k = []
result = [Container() for i in range(4)]
for i,k in enumerate(Dict.keys()):
    result[i] = Dict[k]

有没有更快的解决方案?

【问题讨论】:

  • 副本的 TLDR:您可以使用 globals().update(Dict),但请重新考虑是否真的应该这样做。

标签: python arrays numpy dictionary


【解决方案1】:

您可以使用 exec,但请注意,这可能存在安全风险,不推荐:

Dict = {'a':[1,2,3], 'b':[2,3,4], 'c':[4,5,6]}

for k,v in Dict.items():
    exec(k+" = v")

编辑:

安全风险基本上是有人将代码放入Dict 并试图使其执行。您可以进行的一个无害测试是将d:os.getcwd() 添加到Dict,希望程序已经导入os,然后您稍后将在您的工作目录中拥有一个变量d。例如,您可以使用类似的东西来读取文件内容并将它们发送给其他人。 更恶意的用户可能会尝试执行从硬盘中删除某些文件或安装木马等的代码。老实说,我在短暂尝试时并没有设法做真正恶意的事情,因为天真地做诸如@987654329之类的事情@ 导致语法错误,但很可能有一些方法可以使用我没有想到的一些库(或其他技巧)来做坏事。为了更好地阅读,我会参考this question 和第一个答案中的链接。

【讨论】:

  • 您能否详细说明所涉及的风险?
  • @elpsyCongroo:如果外部代码或数据可以更改字典键,那么k 最终可能会变成'format-hard-disk(); x'。基本上是这样的:xkcd.com/327
  • 啊,是的,好旧的 Bobby 桌子,甚至不用看那个。 ;)
  • 但是要访问我计算机上的字典需要访问我的计算机,对吗?所以一旦我重新启动我的 Python 控制台,字典就被删除了,对吧?
  • 没错,只要您保持对Dict 的唯一和完全控制,这是安全的。如果您从某人可以访问的文件中读取某些内容,或者如果您使用其他 API 并使用来自 Internet 的内容填写 Dict,或者在有人可能会注入您没有的代码的开源项目中,这将变得很危险'不要彻底审查。
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多